【问题标题】:c++ random set seed failedc ++随机设置种子失败
【发布时间】:2019-02-22 08:59:18
【问题描述】:

我正在尝试将种子设置为 c++ std::default_random_engine:

#include<random>
#include<time.h>
#include<iostream>

using namespace std;


void print_rand();


int main() {

for (int i{0}; i < 20; ++i) {
    print_rand();
}
return 0;
}

void print_rand() {
    default_random_engine e;
    e.seed(time(0));

    cout << e() << endl;
}  

打印出来的数字好像是一样的,怎么设置种子根据时间生成随机数呢?

【问题讨论】:

  • using rand to generate a random numbers 的可能重复项,每次调用的播种问题相同。
  • @Kit。是的,每次打印的时间(NULL)都是一样的。
  • @Kit.为什么 time(0) 每次都会给我相同的值?
  • 因为时间以秒为单位还是一样?

标签: c++11 random


【解决方案1】:

您只需播种一次,而不是每次调用该函数。然后你会得到不同的值。我将把功能移到main() 来演示这一点。

#include<random>
#include<time.h>
#include<iostream>

int main() {
    std::default_random_engine e;
    e.seed(time(0));

    for (int i{0}; i < 20; ++i) {
        std::cout << e() << std::endl;
    }
    return 0;
}

Live Demo

【讨论】:

  • 如果我没有主目录怎么办?我实际上是在写一些python扩展,然后我没有main函数。
  • 这只是我为展示正确行为而举的一个例子。关键是您必须只播种一次
  • 您好,请问会为整个过程设置种子吗?如果我在某个函数中设置了种子,函数返回后设置是否仍然有效?
  • 是的,你可以在函数内部有一个静态变量,你只播种一次。
【解决方案2】:

作为@P.W.说,你应该只播种一次。在这个方向上的最小变化是使用静态变量,并将种子提供给构造函数:

#include<random>
#include<time.h>
#include<iostream>

void print_rand();

int main() {
    for (int i{0}; i < 20; ++i) {
        print_rand();
    }
    return 0;
}

void print_rand() {
    static std::default_random_engine e(time(0));

    cout << e() << endl;
}

【讨论】:

    猜你喜欢
    • 2014-11-21
    • 2011-06-14
    • 1970-01-01
    • 2016-01-14
    • 2022-12-17
    • 1970-01-01
    • 2021-03-23
    • 2020-03-18
    • 2014-09-20
    相关资源
    最近更新 更多