我正在研究一个简单的想法,即生成随机数(从1到100)并使用c ++在控制台上打印它们,但问题是,每次运行程序时,它每次都会生成完全相同的数字,它是随机的,单个数字不会重复,但每次都是相同的随机数顺序!
这是我的代码
// DigitDisplayer.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
#include <cstdlib>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
int max = 100;
int min = 1;
int range = (max - min) + 1;
int randnum;
bool nums[100];
for(int j = 0; j < sizeof(nums); j++)
{
nums[j] = false;
}
for(int i = 0; i < range; i++)
{
int randnum = (rand() % range) + 1;
if(nums[randnum] == false){
nums[randnum] = true;
cout<< randnum << "\n\n";
}
else {
int randnum = (rand() % range) + 1;
}
}
cout<< "DONE!!!\n\n";
system ("pause");
}
由于
答案 0 :(得分:1)
C ++中的随机数生成器实际上是一个伪随机序列生成器,它从给定的种子开始。
这样做有两个原因:
在实现C ++库的所有机器上找到真正的随机源非常困难。
显然需要一个生成可重复序列的随机数生成器(例如,如果您的单元测试依赖于随机数,您希望测试是可重复的 - 并且接收相同的“随机数”)
这就是为什么你有srand函数为随机数生成提供“种子”。
如果您没有拨打srand
或者使用相同的值拨打电话,则“随机”序列将始终相同。
如果用不同的种子调用它,结果序列将是唯一的(实际上它可能有一个模式或可预测 - 这取决于实现)。
答案 1 :(得分:0)
您必须使用srand
种子rand
函数,否则它总是返回相同的数字集。
time()
cstdlib
函数
检查一下:
// DigitDisplayer.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
#include <cstdlib>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
int max = 100;
int min = 1;
int range = (max - min) + 1;
int randnum;
bool nums[100];
srand (time(NULL));
for(int j = 0; j < sizeof(nums); j++)
{
nums[j] = false;
}
for(int i = 0; i < range; i++)
{
int randnum = (rand() % range) + 1;
if(nums[randnum] == false){
nums[randnum] = true;
cout<< randnum << "\n\n";
}
else {
int randnum = (rand() % range) + 1;
}
}
cout<< "DONE!!!\n\n";
system ("pause");
}
答案 2 :(得分:0)
你需要为ranom数字生成器播种。查看srand()
了解如何操作。
您通常需要做的就是在使用srand()
之前在某个地方拨打rand()
。请注意,每次运行程序时都应使用不同的值调用srand()
。
例如,使用time()
种子是最简单的方法:
int main()
{
srand(time(NULL));
.....
rand();
.....
}
答案 3 :(得分:0)
计算机无法生成随机数。相反,他们使用算法生成一系列数字,这些数字近似于随机数的行为方式。这些算法称为伪随机数发生器(PNRG)。在我知道的每种情况下,这些PNRG都可以用数字'种子',这决定了伪随机数序列的开始位置。如果您希望每次需要使用不同的数字为PNRG播种时获得不同的结果。对于大多数目的,系统计时器足以生成有效随机的数字序列。正如其他人所解释的那样,srand(time(NULL))
会为你做这件事。
顺便说一句:C中的内置随机数生成器很糟糕。除了最随意的设置外,它不适合使用;如果你想要一个合适的随机数源考虑使用像Mersenne Twister这样的东西。在高度敏感的情况下(例如在线赌博等),从时间播种也会出现问题。