在这个涉及随机数生成的基本C ++代码片段中:
include <iostream>
using namespace std;
int main() {
cout << (rand() % 100);
return 0;
}
为什么我总是得到41的输出?我试图让它输出0到100之间的一些随机数。也许我不理解rand函数是如何工作的?
答案 0 :(得分:34)
答案 1 :(得分:13)
你需要“播种”发电机。看看这个简短的视频,它会清除。
答案 2 :(得分:10)
对于它的价值,你也只生成0到99之间的数字(含)。如果你想生成0到100之间的值,你需要。
rand() % 101
除了调用其他人提到的srand()之外。
答案 3 :(得分:6)
你没有播种这个号码。
使用此:
#include <iostream>
#include <ctime>
using namespace std;
int main()
{
srand(static_cast<unsigned int>(time(0)));
cout << (rand() % 100) << endl;
return 0;
}
你只需要播种一次。基本上不要每个随机数播种它。
答案 4 :(得分:6)
srand()
为随机数生成器播种。没有种子,生成器无法生成您正在寻找的数字。只要一个人对随机数的需求不是安全关键的(例如任何类型的加密),通常的做法是使用time()
库中的<ctime>
函数将系统时间用作种子。如:srand(time(0))
。这将使随机数生成器播种,系统时间表示为Unix时间戳(即自1970年1月1日以来的秒数)。然后,您可以使用rand()
生成伪随机数。
原因是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/
答案 5 :(得分:4)
随机函数,如borland编译器
using namespace std;
int sys_random(int min, int max) {
return (rand() % (max - min+1) + min);
}
void sys_randomize() {
srand(time(0));
}