【问题标题】:Random number bigger than 100,000大于 100,000 的随机数
【发布时间】:2012-11-10 07:38:50
【问题描述】:

我正在用 C/C++ 编写,我想创建很多大于 100,000 的随机数。我会怎么做?与rand();

【问题讨论】:

  • 它们必须全部大于 100,000?它很重要,所以请澄清一下。
  • 是的,它们应该大于 100,000
  • 大于 100,000 且小于...?
  • 别介意。刚好大于 100.000
  • 做一个普通的随机数加100000?

标签: c++ c random numbers


【解决方案1】:

你不会用rand 来做这件事,但是用一个适当的随机数生成器,它带有较新的 C++,参见例如cppreference.com.

const int min = 100000;
const int max = 1000000;
std::default_random_engine generator;
std::uniform_int_distribution<int> distribution(min,max);
int random_int = distribution(generator);  // generate random int flat in [min, max]

不要忘记正确播种您的生成器。

上面我暗示rand 不是一个“正确的”伪RNG,因为它通常带有许多缺点。在最好的情况下,它缺乏抽象,因此从不同的分布中挑选变得困难且容易出错(在网上搜索“随机范围模数”)。同样替换用于生成随机数的底层引擎是 AFAIK 在设计上是不可能的。在不太理想的情况下,rand 作为伪 RNG 不能为许多/大多数用例提供足够长的序列长度。使用 TR1/C++11 生成高质量的随机数很容易始终使用正确的解决方案,因此当出现模糊的错误时,无需首先担心使用的伪随机数发生器的质量。 Microsoft 的 STL 在 GoingNative2013 上就该主题发表了精彩的演讲 summary talk

【讨论】:

  • 谢谢信息!你说 rand 不是一个合适的随机数生成器,你能用一些参数/链接支持你的话吗?
  • @spin_eight:更新了答案。
【解决方案2】:
// Initialize rand()'s sequence. A typical seed value is the return value of time()
srand(someSeedValue);

//...

long range = 150000; // 100000 + range is the maximum value you allow
long number = 100000 + (rand() * range) / RAND_MAX;

如果(100000 + range) 超过其最大值,您可能需要为rangenumber 使用大于long int 的值。

【讨论】:

  • 我得到相同的值 (100001)
  • @user776720 我假设您使用srand() 播种?
  • 尝试使用我添加的括号以确保首先发生乘法。
  • 确保long 的范围大于RAND_MAX,否则会溢出。
  • @WhozCraig 使用 % range 生成的数字将形成不均匀分布(数字越少概率越高)因此将违反随机数的概念。
【解决方案3】:

一般而言,您可以使用介于 0 和 1 之间的随机数生成器,并通过执行以下转换获得您想要的任何范围:

x' = r x + b

因此,如果您想要介于 100,000 和 300,000 之间的随机数,并且 x 是介于 0 和 1 之间的随机数,那么您可以将 r 设置为 200,000 并将 b 设置为 100,000 和 @ 987654325@ 将在您想要的范围内。

【讨论】:

    【解决方案4】:

    如果您还不能访问 C++ 内置函数,Boost 在 Boost.Random 中有一堆真正的随机化器,包括 specific solutions 用于您明显的问题空间。

    我会回应 cmets 澄清您问题中的编辑将提高答案的准确性,例如。 “我需要从 100,001 到 1,000,000 的均匀分布整数”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-02
      • 2014-04-04
      • 1970-01-01
      相关资源
      最近更新 更多