随机数字列表
Random list of numbers
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <math.h>
int main()
{
int i;
int diceRoll;
for(i=0; i < 20; i++)
{
printf("%d \n", rand());
}
return 0;
}
这是我用 c (codeblocks) 编写的用于获取随机数的代码,问题是我总是得到相同的序列:41,18467,6334,26500
等...
我还在学习,所以请试着像你在和一个 8 岁的 D 说话一样解释:
您每次都得到相同的序列,因为未设置随机数生成器的种子。您需要这样调用 srand(time(NULL))
:
int main()
{
srand(time(NULL));
....
首先,通过包含 <ctime>
并调用 srand(time(NULL));
.
为您的随机函数设定种子
其次,如果要调用 rand(),则需要模数,例如:rand() % x 将 return 一个从 0 到 x-1 的随机数。由于您正在模拟掷骰子,因此请执行 rand() % 6 + 1
.
随机数生成器是伪随机的。这意味着他们使用一些 "algorithm" 来得出下一个 "random" 数字。换句话说,如果你从这个算法的相同种子开始,你每次都会得到相同的随机数序列。要解决这个问题,您必须确保为随机数生成器播种。有时,最好使用相同的种子,这样您就可以推断出程序的逻辑是否正确。无论哪种方式,人们为他们的程序播种的一种常见方式是使用 time(NULL)。 time 给出自纪元时间以来经过的时间(以秒为单位)。这意味着这个函数每秒都在变化。因此,如果您在程序开始时使用 (srand(time(NULL)) 为您的随机数生成器播种,您将每隔一秒获得一个不同的随机数序列 运行 您的程序。一定不要为您请求的每个随机数播种。只需在代码的开头执行一次,然后就不要管它了。
你的标题说的是 C#,但我用 C++ 回答了。为此,您需要包括 ctime。查看随机数生成的新样式也可能是有益的,因为现在 rand() 不是很随机。查看 #include random 并使自己成为一个引擎和分布来提取随机数。别忘了在那里播种!
行 srand((unsigned)(time(NULL))
必须在循环之外,此行必须在您的代码中只有一次。
取模 rand()%10
意味着您可以得到从 0
开始的任何数字,直到您被 -1
取模。所以在这种情况下 0-9
,如果你想要 1-10
,你可以这样做:rand()%10 + 1
int main()
{
int i;
int diceRoll;
srand((unsigned)(time(NULL));
for(i=0; i < 20; i++)
{
printf("%d \n", rand() % 10); //Gets you numbers 0-9
}
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <math.h>
int main()
{
int i;
int diceRoll;
for(i=0; i < 20; i++)
{
printf("%d \n", rand());
}
return 0;
}
这是我用 c (codeblocks) 编写的用于获取随机数的代码,问题是我总是得到相同的序列:41,18467,6334,26500
等...
我还在学习,所以请试着像你在和一个 8 岁的 D 说话一样解释:
您每次都得到相同的序列,因为未设置随机数生成器的种子。您需要这样调用 srand(time(NULL))
:
int main()
{
srand(time(NULL));
....
首先,通过包含 <ctime>
并调用 srand(time(NULL));
.
其次,如果要调用 rand(),则需要模数,例如:rand() % x 将 return 一个从 0 到 x-1 的随机数。由于您正在模拟掷骰子,因此请执行 rand() % 6 + 1
.
随机数生成器是伪随机的。这意味着他们使用一些 "algorithm" 来得出下一个 "random" 数字。换句话说,如果你从这个算法的相同种子开始,你每次都会得到相同的随机数序列。要解决这个问题,您必须确保为随机数生成器播种。有时,最好使用相同的种子,这样您就可以推断出程序的逻辑是否正确。无论哪种方式,人们为他们的程序播种的一种常见方式是使用 time(NULL)。 time 给出自纪元时间以来经过的时间(以秒为单位)。这意味着这个函数每秒都在变化。因此,如果您在程序开始时使用 (srand(time(NULL)) 为您的随机数生成器播种,您将每隔一秒获得一个不同的随机数序列 运行 您的程序。一定不要为您请求的每个随机数播种。只需在代码的开头执行一次,然后就不要管它了。
你的标题说的是 C#,但我用 C++ 回答了。为此,您需要包括 ctime。查看随机数生成的新样式也可能是有益的,因为现在 rand() 不是很随机。查看 #include random 并使自己成为一个引擎和分布来提取随机数。别忘了在那里播种!
行 srand((unsigned)(time(NULL))
必须在循环之外,此行必须在您的代码中只有一次。
取模 rand()%10
意味着您可以得到从 0
开始的任何数字,直到您被 -1
取模。所以在这种情况下 0-9
,如果你想要 1-10
,你可以这样做:rand()%10 + 1
int main()
{
int i;
int diceRoll;
srand((unsigned)(time(NULL));
for(i=0; i < 20; i++)
{
printf("%d \n", rand() % 10); //Gets you numbers 0-9
}
return 0;
}