0

我正在研究一个简单的想法,即生成随机数(从 1 到 100)并使用 c++ 在控制台上打印它们,但问题是每次我运行程序时,它每次都会生成完全相同的数字,它是随机的,单个number 不是重复的,而是每次都是相同的随机数顺序!

这是我的代码

// 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

4 回答 4

1

C++ 中的随机数生成器实际上是一个伪随机序列生成器,它从给定的种子开始。

这样做有两个原因:

  • 在所有实现 C++ 库的机器上很难找到真正的随机源。

  • 显然需要生成可重复序列的随机数生成器(例如,如果您的单元测试依赖于随机数,您希望测试是可重复的 - 并接收相同的“随机数”)。

这就是为什么您拥有为随机数生成提供“种子”的 srand 函数。

如果您不调用srand或使用相同的值调用它,您的“随机”序列将始终相同。

如果您使用不同的种子调用它,则生成的序列将是唯一的(实际上它可能具有模式或可预测的 - 这取决于实现)。

于 2013-02-26T14:59:04.740 回答
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");
}
于 2013-02-26T14:45:04.450 回答
0

您需要播种随机数生成器。查看srand()如何做到这一点。

您通常需要做的就是srand()在使用rand(). 请注意,srand()每次运行程序时都应该使用不同的值调用。

例如,使用time()to seed 是最简单的方法:

int main()
{
     srand(time(NULL));
     .....
     rand();
     .....
}
于 2013-02-26T14:51:24.277 回答
0

计算机无法生成随机数。相反,他们使用一种算法来生成一系列近似随机数行为方式的数字。这些算法称为伪随机数生成器 (PNRG)。在我所知道的每一种情况下,这些 PNRG 都可以用一个数字“播种”,这决定了伪随机数序列的开始位置。如果您想在每次需要使用不同的数字播种 PNRG 时获得不同的结果。对于大多数用途,系统计时器足以生成有效的随机数字序列。srand(time(NULL))正如其他人所解释的那样,将为您执行此操作。

顺便说一句:C 中内置的随机数生成器很糟糕。它不适合在最随意的环境中使用;如果您想要一个不错的随机数来源,请考虑使用 Mersenne Twister 之类的东西。在高度敏感的情况下(例如在线赌博等),时间播种也会出现问题。

于 2013-02-26T14:58:59.140 回答