La génération de nombres aléatoires en C
Lors de la recherche de Tutoriels sur la génération de nombres aléatoires en C, j'ai trouvé cette rubrique
Lorsque j'essaie d'utiliser le rand()
fonction sans paramètres, j'ai toujours 0. Lorsque j'essaie d'utiliser le rand()
fonction avec des paramètres, j'ai toujours de la valeur de 41. Et à chaque fois que j'essaie d'utiliser arc4random()
et random()
fonctions, j'obtiens une erreur LNK2019.
Voici ce que j'ai fait:
#include <stdlib.h>
int main()
{
int x;
x = rand(6);
printf("%d", x);
}
Ce code génère toujours de 41. Où vais-je tort? Je suis sous Windows XP SP3 et à l'aide de VS2010 Invite de Commande en tant compilateur.
essayez
rand() * 10
OriginalL'auteur MoonStruckHorrors | 2010-06-18
Vous devez vous connecter pour publier un commentaire.
Vous devriez appeler srand() avant d'appeler rand pour initialiser le générateur de nombre aléatoire.
Soit appeler avec un précis de la graine, et vous obtiendrez toujours la même séquence pseudo-aléatoire
ou l'appeler avec une évolution des sources, c'est à dire la fonction de temps de
En réponse à la Lune Commentaire
rand() génère un nombre aléatoire avec une probabilité égale entre 0 et RAND_MAX (une macro prédéfinie dans stdlib.h)
Vous pouvez associer cette valeur à une valeur plus petite de la gamme, par exemple
Ce pourrait être suffisant pour la plupart des utilisations, mais il est intéressant de souligner que, dans le premier cas, à l'aide de l'opérateur mod introduit un léger biais si N ne divise pas uniformément dans RAND_MAX+1.
Générateurs de nombres aléatoires sont intéressants et complexes, il est bien dit que le rand() générateur dans la bibliothèque C standard n'est pas d'une grande qualité générateur de nombre aléatoire, lecture (http://en.wikipedia.org/wiki/Random_number_generation pour une définition de la qualité).
http://en.wikipedia.org/wiki/Mersenne_twister (source http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html ) est un populaire, haute de qualité générateur de nombre aléatoire.
Aussi, je ne suis pas au courant de arc4rand() ou random() donc je ne peut pas commenter.
rand(10)
mais il n'a pas aidé. 2)Quel était le problème avec moi, en utilisantarc4rand()
etrandom()
?Excellent. Encore Une Fois, Merci.
OriginalL'auteur
Vous devez graines de votre GÉNÉRATEUR de sorte qu'il commence avec une valeur différente à chaque fois.
Un simple mais faible qualité des semences est d'utiliser l'heure actuelle:
Cela vous aidera à démarrer, mais est considéré comme faible qualité (c'est à dire par exemple, ne pas l'utiliser si vous essayez de générer des clés RSA).
Arrière-plan. De nombres Pseudo-aléatoires ne sont pas générateurs de créer de véritables séquences de nombres aléatoires, mais juste simuler. Étant donné un point de départ, un PRNG renverra toujours la même séquence de nombres. Par défaut, ils commencent avec le même état interne permettra de revenir de la même séquence.
De ne pas obtenir la même séquence, vous modifier l'état interne. La loi de l'évolution de l'état interne est appelé "semis".
OriginalL'auteur
Surtout en tant que débutant, vous devriez demander à votre compilateur pour imprimer chaque avertissement sur le mauvais code qu'il peut générer. Les compilateurs modernes connais beaucoup de différents avertissements qui vous aideront à vous améliorer. Par exemple, lorsque vous compilez ce programme avec le Compilateur GNU C:
Vous obtenez deux avertissements ici. Le premier dit que le
rand
fonction ne prend que des arguments zéro, pas un seul que vous avez essayé. Pour obtenir un nombre aléatoire entre 0 etn
, vous pouvez utiliser l'expressionrand() % n
, ce qui n'est pas parfait, mais ok pour les petitsn
. La résultante de nombres aléatoires sont normalement pas répartis de façon uniforme; les plus petites valeurs sont renvoyées à plus souvent.La deuxième avertissement vous indique que vous appelez une fonction, le compilateur ne sait pas à ce point. Vous devez indiquer au compilateur en disant
#include <stdio.h>
. Incluent les fichiers nécessaires pour les fonctions qui n'est pas toujours simple, mais de demander à la spécification pour le portable systèmes d'exploitation des œuvres dans de nombreux cas: http://www.google.com/search?q=opengroup+rand.Ces deux avertissements vous dire beaucoup sur l'histoire de la C langage de programmation. 40 ans en arrière, la définition d'une fonction n'incluent pas le nombre de paramètres ou les types des paramètres. Il a également été ok pour appeler une fonction inconnue, qui, dans la plupart des cas, travaillé. Si vous voulez écrire du code aujourd'hui, vous ne devriez pas compter sur ces anciennes fonctionnalités, mais au lieu de permettre à votre compilateur, d'avertissements, de comprendre les avertissements et puis les fixer correctement.
OriginalL'auteur
Aussi, à congruence linéaire PRNGs ont tendance à produire plus de l'aléatoire sur les bits supérieurs que sur les bits de poids faible, de sorte à pac, le résultat n'utilisez pas de modulo, mais au lieu d'utiliser quelque chose comme:
(Celui-ci est de "Numerical Recipes in C", ch.7)
OriginalL'auteur
Vous devez d'abord semences le générateur, car il ne génère pas de réel nombres aléatoires!
Essayez ceci:
while true; do ./prog; done
). Raymond Chen entrée de blog aujourd'hui vient de se passer à propos de ce problème précis (blogs.msdn.com/b/oldnewthing/archive/2010/06/17/10026183.aspx)Merci. Une bonne lecture en effet.
OriginalL'auteur
Ou, pour obtenir un pseudo-aléatoire int dans la plage de 0 à 19,
par exemple, vous pouvez utiliser les bits supérieurs comme ceci:
>> 15
? Dans certaines implémentationsRAND_MAX
est seulement0x7fff
, de sorte que la vitesse d'un hasard valeur de ce montant serait toujours0
.OriginalL'auteur
OriginalL'auteur