代码的问题是,当我尝试生成一个数字时,如果spin等于1,它会生成范围(1,2,3)内的值,如果尝试使用循环来对其中的随机值求和范围随机数gerated在循环中始终相同,
例如,如果我运行循环: spind3 = 4值从4,8,12开始 spind3 = 5值从5,10,15
这意味着RandomNumber第一次在循环内生成一个值,它在循环完成之前永远不会改变。
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);
}
答案 0 :(得分:26)
您可能正在Random
方法中创建一个新的RandomNumber
对象。 Random
的{{3}}使用系统时间作为种子。如果在紧密循环中创建多个Random
对象,则每次调用之间的时间可能不会发生变化,因此它们都将使用相同的种子进行初始化。
要修复代码,您应该只创建一个Random
对象并重复使用它。
默认种子值源自系统时钟并具有有限的分辨率。因此,通过调用默认构造函数紧密连续创建的不同
Random
对象将具有相同的默认种子值,因此将生成相同的随机数集。使用单个Random
对象生成所有随机数可以避免此问题。您还可以通过修改系统时钟返回的种子值,然后将此新种子值显式提供给Random(Int32)
构造函数来解决此问题。有关更多信息,请参阅Random(Int32)
构造函数。
答案 1 :(得分:5)
问题在于您是否在时间上创建了随机生成器。随机生成器构造函数使用当前时间为生成器播种,当你创建它们的时间太近时,它们将全部使用相同的时间播种。
创建一个随机生成器并在循环中使用:
Random rnd = new Random();
for (int i = 1; i <= spind3.Value; i++) {
diceCalc[1] += rnd.Next(1, 4);
}
答案 2 :(得分:1)
您需要初始化Random对象,然后在循环中调用Next()。
即
if (toggled3.Checked)
{
// initialize your total and the random number generator
int diceTotal = 0;
Random rand = new Random();
for (int i = 0; i < spind3.Value; i++)
{
// add the next random number between 1 and 3
diceTotal += rand.Next(1, 4);
}
}
答案 3 :(得分:1)
您可以使用Random(seed)
构造函数。
Random rand = new Random(Guid.NewGuid().GetHashCode());
答案 4 :(得分:0)
一种技巧是通过将DateTime.Now.Ticks
添加到变量i
来手动创建种子:
Random r = new Random((int)DateTime.Now.Ticks + i);