【问题标题】:Formula used for function rand() in c++c++中函数rand()使用的公式
【发布时间】:2016-01-24 10:25:15
【问题描述】:

我想知道使用 C++ 中的rand() 函数生成随机数的公式是什么。起初我虽然它每次都会返回随机数,但它没有。

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

int main()
{
    cout << "Hello world!" << endl;

    srand(9865);
    cout << rand() << "\n";
    return 0;
}

在这里我想,可能是因为给定的种子编号和未知的公式,它会显示相同的数字。

但是,当我删除“srand(9865);”时并执行几次它只显示“41”作为输出。请解释一下这里发生了什么。

【问题讨论】:

  • 搜索 glibc 代码以了解其实际实现方式以及有关 rand 和 srand 如何交互的 rand maual 页面。

标签: c++ random


【解决方案1】:

来自http://linux.die.net/man/3/rand

“如果没有提供种子值,则 rand() 函数会自动以 1 为种子。”和“..这些序列可以通过调用具有相同种子值的 srand() 来重复。”

【讨论】:

  • 我访问了你上面给出的页面,看到了这个:int myrand(void) { next = next * 1103515245 + 12345;返回((无符号)(下一个/65536)% 32768); }, void mysrand(unsigned seed) { next = seed; } 这是用于生成随机数的公式吗?
【解决方案2】:

您每次都必须使用非静态种子播种随机函数。一种简单但不太准确的解决方案是用时钟播种:

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

int main()
{
    cout << "Hello world!" << endl;

    srand(time(NULL));
    cout << rand() << "\n";
    return 0;
}

【讨论】:

    【解决方案3】:

    库规范没有规定随机数生成器的公式(取决于实现)。唯一指定的是可以通过srand 控制事物以实现一致的伪随机生成:

    为了生成类随机数,srand 通常被初始化为一些独特的运行时值,如函数 time 返回的值(在标题 中声明)。这足以满足大多数琐碎的随机化需求。

    所以:

    1. 如果使用给定种子初始化 srand,则以下 rand 调用将在运行中保持一致。

    2. 如果您使用基于时间的种子初始化 srand,则以下 rand 调用几乎肯定会在运行期间有所不同。

    3. 如果不初始化srand,以下对rand 的调用将使用默认的初始种子。


    请注意,在现代 C++ 中,您应该避免使用这些古老的函数。查看this question的答案。

    【讨论】:

      猜你喜欢
      • 2018-04-30
      • 2014-11-05
      • 2012-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-29
      • 1970-01-01
      • 2015-05-21
      相关资源
      最近更新 更多