【问题标题】:generating random numbers and printing them on the console (C++) [duplicate]生成随机数并在控制台上打印它们(C++)[重复]
【发布时间】:2013-02-26 14:42:51
【问题描述】:

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

谢谢

【问题讨论】:

  • 您应该在程序开始时使用srand() 初始化随机数生成器。
  • 顺便说一句,如果您使用的是预编译头机制,那么您的想法是将 iostream 和 cstdlib 放在 stdafx.h 中,然后编译器可以在编译之间重用加载的头文件。

标签: c++ visual-studio


【解决方案1】:

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

这样做有两个原因:

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

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

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

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

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

【讨论】:

    【解决方案2】:

    您必须使用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");
    }
    

    【讨论】:

    • 我认为值得强调和解释这种变化。您还需要包含&lt;ctime&gt; 或类似名称吗?
    • 抱歉,已更新。 (在 cstdlib 中定义的时间函数)
    • 效果很好!!谢谢!
    • 如果它是您问题的答案,请点赞并将其标记为答案。
    • 我不能投票因为我的声誉 :( 但我将其标记为最佳答案!
    【解决方案3】:

    您需要为随机数生成器播种。查看srand() 了解如何操作。

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

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

    int main()
    {
         srand(time(NULL));
         .....
         rand();
         .....
    }
    

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2014-09-30
        • 2020-07-16
        • 1970-01-01
        • 2021-03-18
        • 1970-01-01
        • 2013-03-24
        • 2012-12-17
        • 1970-01-01
        • 2015-07-02
        相关资源
        最近更新 更多