【问题标题】:Why is the sequence produced by this random number generator always the same? [duplicate]为什么这个随机数生成器产生的序列总是一样的? [复制]
【发布时间】:2013-01-10 18:10:50
【问题描述】:

可能重复:
Why do I always get the same sequence of random numbers with rand()?

我尝试为给定范围内的随机整数实现以下生成器类:

class RandomInteger {

protected:

    std::default_random_engine randomEngine;
    std::uniform_int_distribution<> distribution;

public:

    RandomInteger(int64_t lower, int64_t upper);

    virtual ~RandomInteger();

    virtual int64_t generate();
};


RandomInteger::RandomInteger(int64_t lower, int64_t upper) : distribution(lower, upper) {

}

RandomInteger::~RandomInteger() {
    // TODO Auto-generated destructor stub
}

int64_t RandomInteger::generate() {
    int64_t i = this->distribution(this->randomEngine);
    return i;
}

它产生范围内的整数,但它产生的值序列每次都是相同的 - 不是很随机。为什么?

【问题讨论】:

  • 你能把你设置种子的代码贴出来吗?
  • @honk 我猜没有,这将是问题所在。
  • // TODO Auto-generated destructor stub 任何自动生成的对你来说都是一种伤害……
  • @ildjarn 这是 Eclipse CDT。为什么它是一种伤害?
  • 因为拥有一个用户声明的析构函数会改变你的类型的琐碎性。当编译器生成的实现可以做时,永远不要声明特殊成员。

标签: c++ random c++11


【解决方案1】:

一般来说,伪随机生成器需要一个种子。

如果您从不更改种子,您将始终获得相同的伪随机输出/序列。

编辑:我坚持使用 pseudo-random(有时 pseudo-chaos)这个词而不是滥用的 random

edit2:应该有 c++11 解决你的问题in this other question(看看@R. Martinho Fernandes 的回答)

【讨论】:

  • 感谢您唯一的建设性意见。 “完全重复”没有给出 C++11 解决方案。
  • 在引用的问题上有一些有趣的链接:stackoverflow.com/questions/1108780/…
  • @StephaneRolland 我也喜欢 stackoverflow.com/questions/7217791/random-numbers-in-c0x?rq=1,但我同意 Griwes 的观点,即 OP 只是没有想到种子。
  • “伪混沌”从 Google 返回 4,890 个结果,而“伪随机”返回 1,980,000 个。老实说,我以前从未听说过它,感谢您向我介绍新事物。
  • "pseudochaotique" 从 Google 返回 17000。我很可能有这种偏见,因为我读的是法语。与 Iannis Xenakis 有关他的随机综合,以及有关混沌理论的法国书籍......因此,在英语中说 pseudo-random 可能更正确。 ;-)。我重新编辑:-)
猜你喜欢
  • 2011-05-21
  • 2011-06-25
  • 2019-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-22
  • 2023-03-30
相关资源
最近更新 更多