Comment srand se rapportent à la fonction rand?
Je comprends que la fonction rand() génère le même numéro(s) à chaque fois que vous l'exécutez, si vous ne changez pas le nombre de graines. C'est là que srand (). Le temps est toujours en évolution, donc je sais qu'il faut passer le temps(null) paramètre srand. Ma question est, avec le code ci-dessous à partir d'un tutoriel du site.
int main()
{
int i, n=5;
time_t t;
/* Intializes random number generator */
srand((unsigned) time(&t));
/* Print 5 random numbers from 0 to 50 */
for( i = 0 ; i < n ; i++ ) {
printf("%d\n", rand() % 50);
}
return(0);
}
Je vois pas le lien de la srand
((unsigned) time(&t));
et rand.
printf("%d\n", rand() % 50);
Où est le lien entre le rand et srand? Ce que je veux dire ou attendre je suppose rand() permettra d'obtenir un certain nombre de paramètres de srand() de sorte qu'il sait pour générer des nombres différents à chaque fois. Je suppose qu'il ressemblerait à quelque chose comme rand(srand(time(null));
C'est comme de l'initialisation d'une variable sans l'utiliser pour moi. srand est en cours d'initialisation, mais je ne vois pas qu'il soit utilisé.
N'rand générer des numéros différents parce que srand est appelé en premier avant de rand?
man 3 rand
et man 3 srand
.OriginalL'auteur Arrow | 2014-01-22
Vous devez vous connecter pour publier un commentaire.
La graine du nombre aléatoire est une variable globale statique.
rand
etsrand
les deux ont accès.OriginalL'auteur sqykly
srand()
détermine la valeur qui est utilisée parrand
pour générer des "aléatoire" nombre (entre guillemets parce qu'ils sont généralement pseudo-aléatoire). Si vous n'appelez passrand
avant votre premier appel àrand
, c'est comme si vous aviez appelésrand(1)
pour définir la graine de.Beaucoup de code utilise l'heure actuelle, comme la semence, de manière à faire de chaque programme exécuté à utiliser une autre séquence de nombres aléatoires, mais vous pouvez toujours modifier ce à quelque chose comme
srand(42)
pendant le débogage, pour l'application de la répétabilité. Et l'appel àtime()
ne fait pas besoin une variable pour le temps de place, vous pouvez simplement passer la valeur NULL:Le tout pourrait être mis en œuvre dans un seul fichier avec quelque chose comme la suivante, l'exemple donné dans la norme (
ISO C99 7.20.2.2 The srand function
).Le fait que
next
est une variable statique en haut du fichier signifie qu'il est invisible à tout, à l'extérieur le fichier, mais visible à tout à l'intérieur (une sorte de localisé mondiale). C'est la méthode de communication entresrand()
etrand()
.Une question - Comment le standard est arrivé en grand nombre à l'intérieur de la
rand()
fonction? Quelle est la logique derrière cela?OriginalL'auteur paxdiablo
Vous ne voyez pas de lien parce que (heureusement!) celui qui a conçu
rand()
décidé de garder qu'un détail d'implémentation, de la même manière que vous ne voyez pas ce qui est à l'intérieur d'unFILE
de stdio; l'inconvénient est qu'ils ont décidé de faire de cet état un mondial (mais caché) de la variable plutôt qu'un paramètre à la génératrice.Contraste que le obsolète
rand_r()
: l'état est un entier non signé (supposée >= 32 bits), ce qui signifie que même s'il est interdit à utiliser mieux générateur dont l'état est plus que cela, tout simplement parce qu'il n'y a pas de place pour stocker!En gardant l'état interne caché, au lieu de cela, on est libre de choisir ce que l'algorithme fonctionne le mieux (débit, délai, ...) et l'utiliser en coulisses, aussi longtemps que vous le garantie que l'appel à rand sans initialisation est la même que l'appel à srand avec seed==1.
Paxdiablo vous a montré l'exemple de la norme C; voir, par exemple http://en.wikipedia.org/wiki/Multiply-with-carry pour un exemple en utilisant un autre générateur que l'on peut se cacher derrière rand/srand.
Juste pour être extra-extra clair: a
rand_r
été conçu correctement, il y aurait un type opaque, direrand_t
(qui pourrait être un nombre entier, une structure, un tableau, ...), ce qui vous permettrait de passer àrand_r
et à certains hypoteticalsrand_r
, comme dansLa fonction rand est exactement comme ça, sauf qu'il n'y a qu'un
state
variable.rand
sait ce que la graine est sisrand
ne retourne pas quelque chose que vous passer dansrand
en tant que paramètre. Même si nous n'avons pas (ne devrait pas!) connaître le nombre de bits d'état sont ou exactement l'algorithme de génération de nombres aléatoires, le fait que l'etat est nécessaire, sa durée de vie dépasse celle d'un appel de fonction, et il est accessible à deux fonctions est une conséquence inéluctable de l'être tête de série du générateur de nombres aléatoires - il n'y a pas d'abstraction qui ne pas besoin d'une variable statique quelque part.OriginalL'auteur loreb
rand vous donne une séquence pseudo aléatoire de nombres.
Ce numéro est généré par un algorithme qui retourne une séquence apparemment non liées à des numéros à chaque fois qu'il est appelé. Cet algorithme utilise une graine de générer de la série, qui doit être initialisée à certains distinctif de la valeur à l'aide de la fonction srand.
srand sur chaque appel définit le pointeur à un certain endroit dans la liste qui vous êtes entrer. Si vous ne l'appelez pas à chaque tentative ou de lui donner une correction de la graine, il vous donnera la même séquence. Donc, beaucoup de suggérer de donner au cours du deuxième en tant que semences. Mais si vous essayez d'exécuter votre code dans la même seconde deux fois, il vous donnera la même séquence.
Pour chaque valeur de semences utilisée dans un appel à srand, le générateur de nombres pseudo aléatoires peuvent s'attendre à générer une autre succession de résultats dans les appels suivants à rand pour plus d'explications
OriginalL'auteur Jimit Rupani