2011-01-19 20 views

risposta

17

srand() conferisce alla funzione casuale una nuova semina , un punto di partenza (in genere i numeri casuali vengono calcolati prendendo il numero precedente (o il seme) e quindi eseguono molte operazioni su quel numero per generare il successivo).

time(0) fornisce il tempo in secondi dall'epoca Unix, che è un seme abbastanza "imprevedibile" (è garantito che il tuo seme sarà lo stesso solo una volta, a meno che non inizi il tuo programma più volte nello stesso secondo) .

+1

Che si tratti di "abbastanza buoni imprevedibili" dipende dai mezzi di un aggressore. Se è possibile indovinare quando è stato generato il numero casuale, lo spazio dei possibili valori seme potrebbe essere piuttosto breve. Quindi questo * non * è un modo per generare numeri casuali protetti da crittografia. Ma srand/rand non è comunque adatto per questo ... – sleske

+0

Quando dici: "time (0) indica il tempo in secondi ...", cosa intendi qui? Puoi solo dare un esempio dell'output? Grazie. – Simplicity

+0

L'epoca Unix è il 1 gennaio 1970 00:00:00. 'time (0)' restituisce la quantità di secondi trascorsi da quel momento. – orlp

3

La funzione C rand genera numeri casuali utilizzando un seme (proprio come la maggior parte - qualsiasi? - generatore pseudo-casuale).

srand viene utilizzato per impostare il seme da utilizzare dall'algoritmo generatore casuale. Il valore restituito da time (ad esempio: il secondo corrente) viene in genere passato a tale funzione perché è il valore più semplice da ottenere che è solitamente diverso tra due esecuzioni di un'applicazione

4

Da quello che ricordo, c'è un'equazione che viene utilizzata per generare una sequenza di valori. Il prossimo valore è in qualche modo influenzato dal valore precedente. Utilizzando il tempo, si imposta il valore iniziale dell'equazione. Tieni presente che i valori sono pseudo casuali.

Così, per esempio, se si fa qualcosa di simile:

 

srand(1); 
srand(1); 
 

La stessa sequenza di numeri verrà generato. Tuttavia, se lo fai:

 

srand(time(0)); 
srand(time(0) + 1); 
 

Vengono generate due diverse sequenze di numeri perché il valore di inizializzazione è diverso.

+0

@ user489041: Solo se si esegue il due 'srand (time (0))' con uno spazio di un secondo al centro di essi. –

+1

Nell'ultimo esempio, non molto diverso a meno che non ci sia più di 1 secondo tra due chiamate 'srand'. Ciò vale se hai 'srand (time (0))' una volta all'inizio dell'applicazione e lo esegui molte volte al secondo (alcuni approcci di scripting, per esempio). Può essere sorprendente a volte. – Kos

+0

@Tomalak Gert'kal @ Kos- D'accordo, quello era un brutto bug che dovevo trovare una volta. Nell'esempio, le linee verranno eseguite molto più rapidamente di un secondo di distanza. Risposta aggiornata – user489041

2

C'è uno article at Wikipedia che fornisce una buona cronologia e esempi di algoritmi utilizzati.

La versione breve è quella rand() e il suo numero è generatori di numeri pseudocasuali. In realtà, sono in realtà deterministici — la sequenza di numeri prodotti è sempre la stessa. Tuttavia, la sequenza è molto molto lunga e il meccanismo di seeding fornisce un modo per iniziare in un posto (più o meno) arbitrario in quella sequenza.

A seconda di come verranno utilizzati i numeri casuali, esistono vari criteri per valutare la qualità di un generatore pseudocasuale. In circostanze molto semplici, forse tutto ciò che è necessario è una bassa probabilità di valori ripetuti da chiamate consecutive a rand(). Tuttavia, è probabile che si desideri che i numeri siano conformi anche a una particolare distribuzione statistica. (Per quanto ne so, la maggior parte dei PRNG produce numeri distribuiti uniformemente.Tuttavia esistono varie funzioni o possono essere facilmente scritte per trasformarle in una distribuzione gaussiana o qualsiasi altra di cui potresti aver bisogno.)

Infine, quando la sicurezza è un problema, vuoi un algoritmo che è, per tutti gli scopi pratici, imprevedibile. Se un utente malintenzionato conosce il numero generato in precedenza, non dovrebbe essere in grado di anticipare il successivo.Nelle applicazioni di sicurezza molto elevata, potrebbe essere utilizzato un generatore di numeri veramente casuale; questi si baserebbero su varie fonti esterne di casualità, come la radio statica, il rumore termico in un dispositivo di acquisizione di immagini (copriobiettivo inserito) o altre fonti simili. Inoltre, molti sistemi operativi moderni (incluso Linux) raccolgono e immagazzinano un "entropy pool" da varie fonti come le interazioni utente imprevedibili e consentono la produzione di numeri casuali da quello.

Un errore di programmazione comune da parte di persone non abituate a lavorare con generatori pseudocasuali è ri-seminare prima di ogni chiamata a rand(). Certo, questo non è necessario e probabilmente indesiderabile. Seme ogni generatore solo una volta.

3

primo luogo, srand & rand è per/da C, C++ non, C++ 0x presenta un proprio random number generator classes.

Diverso da quello che srand & rand sono implementazione definiti, hanno solo bisogno di fornire una casuale tra 0 e RAND_MAX. Su windows è un codice base MWC16/32, che utilizza TLS per memorizzare le sementi, srand imposta tale seme, che viene quindi utilizzato da rand per eseguire il rollup di un numero pseudo casuale.

A causa di generatori di numeri casuali è piuttosto terribile, soprattutto la versione di Windows.

+0

+1 Buon punto sulla sicurezza. Si noti inoltre che almeno in ISO C RAND_MAX può essere piccolo come 32.768, quindi fornisce solo 15 bit di casualità, anche se si utilizza un seme perfettamente casuale ... – sleske

-2
#include "stdio.h" //rmv coding for srand is pure 
#include "conio.h" 
#include "time.h" 

void main() 
{ 

    time_t t; 

    srand(time(0)); 

    for (i = 1; i <= 10; i++) 
     cout << (unsigned) rand() % 1000 - 90 << "\t"; 

    for (i = 1; i <= 10; i++) 
     cout << (char) rand() % 100 - 90 << "\t"; 

    getch(); 

} 
+0

Questa non è una risposta alla domanda, né è valida Codice C++. –

Problemi correlati