【问题标题】:True random integer between 20 and 30 in C++ [duplicate]C ++中20到30之间的真正随机整数[重复]
【发布时间】:2014-11-09 14:48:42
【问题描述】:

如果很明显,请原谅我,但是我在生成范围内真正随机整数的想法时遇到了一些麻烦,我刚刚开始使用 C++。 我当前的代码:

int start = rand() % 30 + 20;

总是得到 31,因为这是一个“伪随机”整数。也是30以上! 这种方式可以实现真正的随机数吗,还有,我如何才能真正生成范围内的数字?

-杰

【问题讨论】:

  • 您无法通过这种方式获得“真正的随机数”。要获得真正的随机数,您需要一个真正的随机事件。例如,基本粒子衰变、白噪声等......

标签: c++ random


【解决方案1】:

普通电脑只能产生伪随机数,
但这意味着生成的数字每次都相同。
您的问题是您忘记了srand,无论哪种方式,兰特都不是那么好,
并且公式应该是(rand() % 10) + 20

对于比 rand 更好的生成器,请参见例如。 Mersenne Twister(包括<random>)。
对于“真”随机数,您需要特殊的硬件。

【讨论】:

  • (旁注:如果处理得当,从麦克风捕获输入是一种廉价的“真实”随机源。但即使是麦克风也不是每台计算机都内置的,有人可能会争论环境噪声在一定程度上也是可以预测的)。
  • 获得随机性的方法比这简单得多。互联网上的站点从随机的自然现象(如世界范围内的雷击)中获取随机数。 random.org
  • 在运行时在 C++ 程序中从 random.org 获取数字比在 <random> 中调用方法更容易吗?而且出于安全原因,即使互联网具有完美的随机性,任何互联网(也没有梅森捻线机)都不够好。
  • 绝对的;使用标准函数。我只是在比较您从麦克风获得真正随机性的示例。与其他更简单的方法相比,这似乎过于困难(而且容易妥协)。
【解决方案2】:

在 C++ 中,您可能会这样做:

#include <iostream>
#include <random>
#include <chrono>

class Rand_int {
public:
  Rand_int(int low, int high)
    : re(std::chrono::system_clock::now().time_since_epoch().count()),
      dist{low,high} { }
  int operator()() { return dist(re); }
private:
  std::default_random_engine re;
  std::uniform_int_distribution<> dist;
};


int main() {
  Rand_int rnd {20, 30};
  for (int i=0; i<10; i++)
    std::cout << rnd() << '\n';
  return 0;
}

【讨论】:

    猜你喜欢
    • 2013-07-28
    • 1970-01-01
    • 1970-01-01
    • 2011-08-10
    • 2016-05-31
    • 1970-01-01
    • 1970-01-01
    • 2011-08-19
    • 2016-01-26
    相关资源
    最近更新 更多