您好亲爱的stackoverflow成员我最近开始学习C ++,今天我写了一个小游戏,但我的随机功能无法正常工作。当我不止一次调用我的随机函数时,它不会重新生成一个数字,它会一遍又一遍地打印相同的数字。如何在不使用for循环的情况下解决此问题? 感谢
#include "stdafx.h"
#include <iostream>
#include <time.h>
using namespace std;
int rolld6();
int main()
{
cout<<rolld6()<<endl;
cout<<rolld6()<<endl;
system("PAUSE");
return 0;
}
int rolld6()
{
srand(time(NULL));
return rand() % 6 + 1;;
}
答案 0 :(得分:11)
srand(time(NULL));
通常应该在main()
开头一次完成,而且永远不会再次。
每次在同一秒内拨打rolld6
时,你拥有它的方式都会给你相同的数字,这可能是很多次次,并且在你的样本中,接近保证,因为你快速连续两次调用它。
试试这个:
#include "stdafx.h"
#include <iostream>
#include <time.h>
#include <stdlib.h>
int rolld6 (void) {
return rand() % 6 + 1;
}
int main (void) {
srand (time (NULL));
std::cout << rolld6() << std::endl;
std::cout << rolld6() << std::endl;
system ("PAUSE");
return 0;
}
要记住的另一件事是,如果你快速连续两次运行这个程序。如果时间没有改变,你将在两次运行中获得相同的两个数字。当你有一个脚本多次运行程序并且程序本身很短暂时,这通常只是一个问题。
例如,如果您取出system()
来电,并且有一个cmd.exe
脚本,它会调用三次,那么您可能会看到以下内容:
1
5
1
5
1
5
这不是你通常会做的事情,但应该记住场景弹出的可能性。
答案 1 :(得分:8)
您不断重播随机数生成器。只能在程序开头调用srand(time(NULL));
一次。
答案 2 :(得分:0)
随机函数(无论语言)只是部分随机。
在每项技术中,您将获得相当于
的技术srand(time(NULL));
这段代码将随机函数种子化为起始值,然后是从那里开始生成的数字a 这意味着如果您总是重新种植相同的值,您将始终获得相同的数字
在你的情况下,你想做这样的事情(调用srand(time(NULL));只调用一次。)
int rolld6 (void) {
return rand() % 6 + 1;;
}
int main (void) {
srand (time (NULL));
...
//call your function here
}
使用相同值播种的优势之一是提供重新生成相同序列随机数的可能性。
在我的一个游戏中,我会随机将对象放在屏幕上,但我也想实现一个重试选项。从相同值重新选择的这个选项允许我重做它而不存储所有随机值^^