【问题标题】:same number is displayed for a single output but the output is as expected when there is more than 1 output单个输出显示相同的数字,但当输出超过 1 个时输出与预期相同
【发布时间】:2011-07-01 13:56:49
【问题描述】:

这是一个小程序:

#include <iostream>
#include <cstdlib>
using namespace std;
int main() {    
    long x = rand();
cout << x << endl;
}

它总是显示41。但是如果我像这样修改程序,

#include <iostream>
#include <cstdlib>
using namespace std;
int main() {
   for( int i = 0 ; i <= 9 ; i++ ) {    
    long x = rand();
cout << x << endl;
  }
}

输出如预期。随机数集。 输出

41

18467

6334

26500

19169

15724

11478

29358

26962

24464

但是为什么我在运行第一个程序时得到相同的数字rand实际上是如何工作的?

【问题讨论】:

    标签: c++ visual-c++ random


    【解决方案1】:

    编译器内置的随机数生成器通常是伪随机数生成器。他们通常使用递归方程来生成下一个随机数,并使用种子来生成第一个随机数。 Check this link.

    为避免与第一个随机数相同,您需要更改种子。同样,相同的种子将为您提供相同的初始随机数以及相同的随机数序列。因此,您应该在每次运行程序/线程时更改种子。

    要设置种子,您需要致电srand()。每次调用 srand() 时更改种子值的最佳方法是使用当前时间戳:time(0)

    【讨论】:

      【解决方案2】:

      您需要使用srand 播种随机数生成器。

      这通常通过以下方式完成:

      srand(time(0));
      

      如果每秒有一个不同的系列就足够了。

      time 函数仅返回自纪元 1970-01-01 00:00:00 +0000 (UTC) 以来的当前时间(以秒为单位)。

      【讨论】:

      • @Suhail:这是一个函数;它获取当前时间。
      【解决方案3】:

      发件人:http://www.gnu.org/s/hello/manual/libc/ISO-Random.html

      函数:void srand(无符号整数)

      此函数将种子建立为一系列新的伪随机数的种子。如果您在使用 srand 建立种子之前调用 rand,它将使用值 1 作为默认种子。

      如果您在srand 中提供相同的种子,您将始终获得相同的数字序列。如果您从不调用srand,那么每次运行应用程序时您将始终获得相同的序列。

      播种rand 的一个常见技巧是使用time(0) - 基本上是读取系统的时钟。这在一个只需要“大部分随机”的简单应用程序中很好。

      但是,当真正的随机性真的很重要时:

      请注意,您不应该简单地从系统时间播种到必须加密安全的应用程序(例如进行身份验证哈希计算的应用程序)或具有强随机性保证的应用程序(例如真钱赌博游戏)。

      事实上,您根本不应该在这样的应用程序中使用rand。相反,您应该使用不同的随机函数;可能是特定于操作系统的(专门为密码学提供的),或者使用真实的随机数物理源。

      【讨论】:

        猜你喜欢
        • 2010-11-17
        • 1970-01-01
        • 1970-01-01
        • 2019-04-21
        • 2011-04-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多