【问题标题】:How can I generate random probability values using C programming language?如何使用 C 编程语言生成随机概率值?
【发布时间】:2021-03-22 05:12:20
【问题描述】:

如果我做rand()/RAND_MAX,它会给我一个随机概率值吗?

如果我这样做,是否有 50%(平均)的值会超过 0.5?

【问题讨论】:

  • 设为rand() / (double)RAND_MAX,否则它是一个整数除法,几乎总是0
  • 只使用1.*rand()/RAND_MAX - 因为 rand() 可以返回 0 和 RAND_MAX 这两者都可以返回一个从 0.0 到 1.0 的值
  • 它是随机的,所以你的结果会有所不同,但我得到了Number less than 0.5 = 50000517 Number greater than 0.5 = 49999483 onlinegdb.com/BJd-joSEd
  • rand() 被认为是非常糟糕的伪随机数生成器,所以 YMMV。

标签: c random


【解决方案1】:

永远不要将rand()用于任何目的。

random() 可能适合您的需求。 (#include <stdlib.h>) 它在 0..231-1 范围内生成均匀分布。 random() / (double)((1L << 31) - 1) 应该让您接近 0.01.0 之间的均匀分布。

您可以使用srandomdev() 为其播种,以便每次获得不同的序列。

这是由random() 在 0..2 范围内的 256 个 bin 中返回的 10 亿个值的直方图31-1:

如果您仔细观察,您可以看到直方图顶部与均匀一致的预期微小变化。

【讨论】:

  • 我的手册页和 POSIX 手册中都没有提到任何发行版。能详细说明一下函数分布吗?
  • 应该明确地说,但是对于任何这样的随机数生成器都是预期的,以及使用这些溢出/模算术方法生成伪随机数时隐含的。该范围内的所有可能值都可以被序列同等访问。
  • 那么序列是均匀分布的?
  • @user14063792468 图片显示了 10 亿 个值,我认为它足够统一,并且只能产生 2^31 个不同的值,但无论如何都会比 @ 好得多987654331@ 保证只产生 2^15 个不同的值。
  • @user14063792468 查看直方图。
【解决方案2】:
  1. 是的,rand() / (double)RAND_MAX 会给你一个随机值。
  2. 不,rand() 没有提到统一(或任何其他)分布。无法保证“会达到 50%(平均)”。

C 中具有均匀分布是另一个问题。您可能对Generating a uniform distribution of INTEGERS in C SO 主题感兴趣。

【讨论】:

  • 请注意,通常要求 (P)RNG 均匀分布。即每个位以 0.5 的概率为真,并且彼此独立。异常往往会被调出,例如xoshiro256+ 这对于低位不正确,但是这些位在使用时会被丢弃,因为它的设计是为了提高性能而值得这样做
  • @SamMason 老实说,真的,我不知道。
猜你喜欢
  • 2015-07-05
  • 1970-01-01
  • 1970-01-01
  • 2014-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多