Générateur de nombre aléatoire choisit toujours la même valeur lors de l'exécution à l'intérieur d'une boucle
Le problème avec le code, quand j'essaie de générer un nombre, si le spin est égal à 1, il génère des valeurs à l'intérieur de la fourchette (1,2,3) si si essayez d'utiliser la boucle à la somme des valeurs aléatoires à l'intérieur de la même gamme, le nombre aléatoire gerated est toujours le même, tandis que dans la boucle,
exemple, si je lance la boucle avec:
spind3 = 4 les valeurs vont de 4, 8, 12
spind3 = 5 les valeurs de 5, 10, 15
Que, la première fois, le RandomNumber génère une valeur à l'intérieur de la boucle, il ne changez jamais jusqu'à ce que la boucle se termine.
if (toggled3.Checked)
{
if (spind3.Value != 1)
{
for (int i = 1; i <= spind3.Value; i++)
{
diceCalc[1] += RandomNumber(1, 4);
}
}
else
diceCalc[1] = RandomNumber(1, 4);
}
Comment est mis en œuvre
double possible de Pourquoi semble-t-il que mon générateur de nombre aléatoire n'est pas aléatoire en C#?
xkcd.com/221
il pourrait être ... 😛
double possible de générateur de nombres Aléatoires seulement de générer un nombre aléatoire
RandomNumber()
méthode ?double possible de Pourquoi semble-t-il que mon générateur de nombre aléatoire n'est pas aléatoire en C#?
xkcd.com/221
il pourrait être ... 😛
double possible de générateur de nombres Aléatoires seulement de générer un nombre aléatoire
OriginalL'auteur Primordium | 2011-03-22
Vous devez vous connecter pour publier un commentaire.
Vous êtes probablement la création d'un nouveau
Random
objet à l'intérieur deRandomNumber
méthode. Le constructeur par défaut pourRandom
utilise le système de temps est comme une semence. Si vous créez plusieursRandom
objets dans une boucle serrée, le temps ne sera probablement pas avoir changé entre chaque appel, donc ils seront initialisés avec la même graine.Pour corriger votre code, vous ne devez en créer un
Random
objet et de le réutiliser.De la la documentation:
OriginalL'auteur Mark Byers
Le problème, c'est que vous êtes la création de générateurs aléatoires trop proche dans le temps. Le générateur aléatoire constructeur utilise à l'heure actuelle à la graine du générateur, et lorsque vous créez trop proche dans le temps, ils vont tous être ensemencées à l'aide de la même temps.
Créer un générateur de hasard et d'utiliser dans la boucle:
OriginalL'auteur Guffa
Vous devez initialiser votre objet Aléatoire, puis appel à Next() à l'intérieur de votre boucle.
c'est à dire
OriginalL'auteur Winger
Vous pouvez utiliser
Random(seed)
constructeur.OriginalL'auteur Bayram Üçüncü
Une astuce consiste à créer manuellement la graine par l'ajout de
DateTime.Now.Ticks
à la variablei
:OriginalL'auteur rad