gpt4 book ai didi

C++11:如何使用 设置种子

转载 作者:行者123 更新时间:2023-12-03 20:27:13 25 4
gpt4 key购买 nike

我正在练习随机库,这是 C++11 的新手。我编写了以下最小程序:

#include <iostream>
#include <random>
using namespace std;
int main() {
default_random_engine eng;
uniform_real_distribution<double> urd(0, 1);
cout << "Uniform [0, 1): " << urd(eng);
}

当我反复运行它时,它每次都会给出相同的输出:
>a
Uniform [0, 1): 0.131538
>a
Uniform [0, 1): 0.131538
>a
Uniform [0, 1): 0.131538

我想让程序在每次调用时设置不同的种子,以便每次生成不同的随机数。我知道 random 提供了一个名为 seed_seq 的工具,但我发现它的解释(在 cplusplus.com 上)完全模糊:

http://www.cplusplus.com/reference/random/seed_seq/

我很感激关于如何让程序在每次调用时生成新种子的建议:越简单越好。

我的平台:
  • Windows 7:TDM-GCC compiler
  • 最佳答案

    拥有 seed_seq 的意义是增加生成序列的熵。如果您的系统上有一个 random_device ,那么使用来自该随机设备的多个数字进行初始化可能会做到这一点。在具有伪随机数生成器的系统上,我认为随机性不会增加,即生成的序列熵。

    在此基础上,您的方法:

    如果您的系统确实提供了一个随机设备,那么您可以像这样使用它:

      std::random_device r;
    // std::seed_seq ssq{r()};
    // and then passing it to the engine does the same
    default_random_engine eng{r()};
    uniform_real_distribution<double> urd(0, 1);
    cout << "Uniform [0, 1): " << urd(eng);

    如果您的系统没有随机设备,那么您可以使用 time(0)作为 random_engine 的种子
      default_random_engine eng{static_cast<long unsigned int>(time(0))};
    uniform_real_distribution<double> urd(0, 1);
    cout << "Uniform [0, 1): " << urd(eng);

    如果您有多个随机源,您实际上可以执行此操作(例如 2)
    std::seed_seq seed{ r1(), r2() };
    default_random_engine eng{seed};
    uniform_real_distribution<double> urd(0, 1);
    cout << "Uniform [0, 1): " << urd(eng);

    其中 r1 , r2 是不同的随机设备,例如热噪声或量子源。

    当然你可以混搭
    std::seed_seq seed{ r1(), static_cast<long unsigned int>(time(0)) };
    default_random_engine eng{seed};
    uniform_real_distribution<double> urd(0, 1);
    cout << "Uniform [0, 1): " << urd(eng);

    最后,我喜欢用单行初始化:
      auto rand = std::bind(std::uniform_real_distribution<double>{0,1},
    std::default_random_engine{std::random_device()()});
    std::cout << "Uniform [0,1): " << rand();

    如果您担心 time(0)拥有第二个精度,您可以通过使用 high_resolution_clock 来克服这个问题。要么通过请求自纪元以来的时间首先由 bames23 below 指定:
    static_cast<long unsigned int>(std::chrono::high_resolution_clock::now().time_since_epoch().count()) 

    或者可能只是玩 CPU 随机性
    long unsigned int getseed(int const K)
    {

    typedef std::chrono::high_resolution_clock hiclock;

    auto gett= [](std::chrono::time_point<hiclock> t0)
    {
    auto tn = hiclock::now();
    return static_cast<long unsigned int>(std::chrono::duration_cast<std::chrono::microseconds>(tn-t0).count());
    };

    long unsigned int diffs[10];
    diffs[0] = gett(hiclock::now());
    for(int i=1; i!=10; i++)
    {
    auto last = hiclock::now();
    for(int k=K; k!=0; k--)
    {
    diffs[i]= gett(last);
    }
    }

    return *std::max_element(&diffs[1],&diffs[9]);
    }

    关于C++11:如何使用 <random> 设置种子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34490599/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com