C++中随机数生成范围内

Posted

技术标签:

【中文标题】C++中随机数生成范围内【英文标题】:random number generation in C++ within a range 【发布时间】:2019-10-22 10:10:06 【问题描述】:

我有一个问题,我必须生成具有以下条件的随机数 1) 数字应该是 b/w 0 和 1。

2) 数字以同样可能的方式产生

假设我有一个数字 x,例如 0.0028。如果我将此随机数生成器调用 10000 次,那么它应该产生小于 x 为 28 的数字。这是如何实现的。有人有什么想法吗。我尝试使用各种发行版,但未能成功达到预期的效果。

【问题讨论】:

请告诉我们,您已经尝试过什么。在 c++11 中,您还拥有所有必需的发行版。 澄清这个问题,因为老实说,我个人不知道“......那么它应该产生小于 x 的数字为 28”。甚至意味着。 我已经尝试过如下所示的 uniform_real_distribution。当小数部分较小时,结果与实际结果存在较大差异。 @WhozCraig 我想构建一个随机数生成器,它可以根据我将输入的数字 x 生成数字。在运行生成器 10000 次时,小于 x 的数字应该是 x*10000 也许您可以分享实际用例。看起来随机数似乎不能解决您的实际问题。 这个很不清楚。您是在问如何生成值以使其 sum 正好为 28?如果不是,应该以什么方式生成 0 到 1 之间的值产生 28? 【参考方案1】:

您正在寻找的是一个均匀分布的随机数生成器。这是来自C++ documentation 的示例:

编辑:Link to cppreference which contains another example.

它会产生我理解您需要的结果,但问题中的更多细节会很有帮助。

// uniform_real_distribution
#include <iostream>
#include <random>

int main()

  const int nrolls=10000;  // number of experiments
  const int nstars=95;     // maximum number of stars to distribute
  const int nintervals=10; // number of intervals

  std::default_random_engine generator;
  std::uniform_real_distribution<double> distribution(0.0,1.0);

  int p[nintervals]=;

  for (int i=0; i<nrolls; ++i) 
    double number = distribution(generator);
    ++p[int(nintervals*number)];
  

  std::cout << "uniform_real_distribution (0.0,1.0):" << std::endl;
  std::cout << std::fixed; std::cout.precision(1);

  for (int i=0; i<nintervals; ++i) 
    std::cout << float(i)/nintervals << "-" << float(i+1)/nintervals << ": ";
    std::cout << std::string(p[i]*nstars/nrolls,'*') << std::endl;
  

  return 0;

【讨论】:

正如我所说,我已经使用了这个发行版,但我没有得到想要的结果 旁注:一般情况下,cppreference 通常是更好的引用选择,cplusplus.com 有时已过时甚至包含错误... @Aconcagua 我还添加了来自 cppreference 的参考。感谢您的提示! @user2033594: 分布似乎是正确的,Demo 你有大约 28 个数字低于目标。 @jarod42 在某些情况下生成的数字非常偏离。这是因为数字不正确的小数因素。有解决办法吗【参考方案2】:

您对随机数生成概念的假设有点错误。随机数生成器算法旨在确保在指定范围内选择任何数字的机会几乎相等。但是,他们从不保证在所有生成的数字序列中提供均匀分布。 在这里,您也没有指定您生成的随机数的类型。如果它是双倍的,由于可能的数字范围很大,它可能会产生一些不准确。也许尝试使用随机整数可以解决您的问题。

【讨论】:

以上是关于C++中随机数生成范围内的主要内容,如果未能解决你的问题,请参考以下文章

UE4 C++ 在指定区域范围内随机生成character

在VB中,如何生成某个范围内的随机整数?

java生成指定范围内随机秒数

SQL Server生成指定范围内的随机数

shell生成指定范围内的随机数

在范围内生成'n'个唯一随机数[重复]