在这个涉及随机数生成的相当基本的C++代码片段中:
include <iostream> using namespace std; int main() { cout << (rand() % 100); return 0; }
为什么我总是得到一个41的输出,我试着让它输出一个0到100之间的随机数,也许我不理解rand函数是怎么工作的?
62o28rlo1#
您需要更改seed。
int main() { srand(time(NULL)); cout << (rand() % 101); return 0; }
srand播种对于c代码也是正确的。另请参阅:http://xkcd.com/221/
srand
c
fnvucqvd2#
你需要“播种”发电机。看看这个短视频,它会把事情弄清楚。https://www.thenewboston.com/videos.php?cat=16&video=17503
jpfvwuh43#
值得一提的是,你也只生成了0到99(含)之间的数字。如果你想生成0到100之间的值,你需要。
rand() % 101
此外还调用其他人提到的srand()。
qhhrdooz4#
你不能播号码。使用此:
#include <iostream> #include <ctime> using namespace std; int main() { srand(static_cast<unsigned int>(time(0))); cout << (rand() % 100) << endl; return 0; }
不过你只需要给它种一次种,基本上不要给每个随机数都种。
50pmv0ei5#
srand()为随机数生成器设定种子。如果没有种子,生成器将无法生成您要查找的数字。只要用户对随机数的需求不是安全关键的(例如,任何类型的加密),通常的做法是使用<ctime>库中的time()函数将系统时间用作种子,如下所示:srand(time(0))。这将使用表示为Unix时间戳的系统时间(即自日期1/1/1970以来的秒数)作为随机数生成器的种子。然后,您可以使用rand()生成伪随机数。下面是对duplicate question的引用:原因是rand()函数生成的随机数实际上并不是随机的,它只是一个变换。维基百科对伪随机数生成器的含义给出了更好的解释:每次你调用rand()时,它会获取种子和/或最后生成的随机数(C标准没有指定所使用的算法,尽管C++11有指定一些流行算法的工具),对这些数运行一个数学运算,所以如果每次的种子状态都是相同的(如果你没有用一个真正的随机数调用srand),那么你总是会得到相同的“随机”数。如果您想了解更多信息,请阅读以下内容:http://www.dreamincode.net/forums/topic/24225-random-number-generation-102/http://www.dreamincode.net/forums/topic/29294-making-pseudo-random-number-generators-more-random/
srand()
<ctime>
time()
srand(time(0))
rand()
sbdsn5lh6#
Borland编译器等随机函数
using namespace std; int sys_random(int min, int max) { return (rand() % (max - min+1) + min); } void sys_randomize() { srand(time(0)); }
jdzmm42g7#
“srand(时间(空));“作为“main()”的第一行,如果您在静态init.某处使用“兰德()”,将不会有任何帮助。您最好创建“struct rnd_init { rnd_init(){ srand(time(nullptr));} }”,命名为任何适合您的名称,作为使用“兰德()”的作用域中的静态变量:在某个构造器上,或者别的什么地方
7条答案
按热度按时间62o28rlo1#
您需要更改seed。
srand
播种对于c
代码也是正确的。另请参阅:http://xkcd.com/221/
fnvucqvd2#
你需要“播种”发电机。看看这个短视频,它会把事情弄清楚。
https://www.thenewboston.com/videos.php?cat=16&video=17503
jpfvwuh43#
值得一提的是,你也只生成了0到99(含)之间的数字。如果你想生成0到100之间的值,你需要。
此外还调用其他人提到的srand()。
qhhrdooz4#
你不能播号码。
使用此:
不过你只需要给它种一次种,基本上不要给每个随机数都种。
50pmv0ei5#
srand()
为随机数生成器设定种子。如果没有种子,生成器将无法生成您要查找的数字。只要用户对随机数的需求不是安全关键的(例如,任何类型的加密),通常的做法是使用<ctime>
库中的time()
函数将系统时间用作种子,如下所示:srand(time(0))
。这将使用表示为Unix时间戳的系统时间(即自日期1/1/1970以来的秒数)作为随机数生成器的种子。然后,您可以使用rand()
生成伪随机数。下面是对duplicate question的引用:
原因是rand()函数生成的随机数实际上并不是随机的,它只是一个变换。维基百科对伪随机数生成器的含义给出了更好的解释:每次你调用rand()时,它会获取种子和/或最后生成的随机数(C标准没有指定所使用的算法,尽管C++11有指定一些流行算法的工具),对这些数运行一个数学运算,所以如果每次的种子状态都是相同的(如果你没有用一个真正的随机数调用srand),那么你总是会得到相同的“随机”数。
如果您想了解更多信息,请阅读以下内容:
http://www.dreamincode.net/forums/topic/24225-random-number-generation-102/
http://www.dreamincode.net/forums/topic/29294-making-pseudo-random-number-generators-more-random/
sbdsn5lh6#
Borland编译器等随机函数
jdzmm42g7#
“srand(时间(空));“作为“main()”的第一行,如果您在静态init.某处使用“兰德()”,将不会有任何帮助。您最好创建“struct rnd_init { rnd_init(){ srand(time(nullptr));} }”,命名为任何适合您的名称,作为使用“兰德()”的作用域中的静态变量:在某个构造器上,或者别的什么地方