生成随机数并在控制台上打印它们(C ++)

时间:2013-02-26 14:42:51

标签: c++ visual-studio

我正在研究一个简单的想法,即生成随机数(从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");
}

由于

4 个答案:

答案 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这样的东西。在高度敏感的情况下(例如在线赌博等),从时间播种也会出现问题。