【问题标题】:How to generate highly uniform random number in python?如何在python中生成高度均匀的随机数?
【发布时间】:2011-08-27 21:52:25
【问题描述】:

不知何故,我需要一个可以生成高度一致的数字的随机函数,例如,当我说 [5,5] 时,我运行这个函数 10 次,我想要 5 个小于 0.5 的数字其他5个数字都大于0.5。

每次运行都应该分开,例如:

for i in range(0,10):
   rnd=random_function([6,3,1])
   print rnd

运行此函数十次后,我有 6 个小于 0.6 的数字,3 个介于 0.6 和 0.9 之间的数字,以及 1 个介于 0.9 和 1 之间的数字。

有人知道我该怎么做吗?因为python里面的随机函数不是那么统一....谢谢!!

【问题讨论】:

  • 即使是最好的 RNG 也不一定能满足您的需求。如果您想要某个给定范围内的数字,请使用该范围调用 RNG。均匀分布是随着生成的数字数量接近无穷大而发生的。您不能总是指望 10 个随机数的一致性。
  • 这将仅在限制中是统一的;如果它总是统一的,那不会是随机的,不是吗?
  • 你应该更好地解释你想要做什么。如果你想要统一性,你并不真正想要随机性。在你真的不介意结果的地方使用随机函数,提供一个范围。在第一个示例中,您需要两组不同的随机数。
  • 在每 1024 次试验中,统一随机数 生成器的所有 10 个数都低于 0.5。你所要求的不是随机的。

标签: python random uniform


【解决方案1】:

不均匀不就是随机的本质吗?如果要生成 6 个随机数,并且希望其中一半小于 0.5,另一半大于 0.5,则应生成 3 个介于 0 和 0.5 之间的数字,并生成 3 个介于 0.5 和 1 之间的数字。

【讨论】:

    【解决方案2】:

    你要求的是不是随机的;事实上,它是相当结构化的。随机数据的关键在于它不是结构化的:你不能说值是什么,只能说它们平均是什么。

    不过,您仍然可以做您想做的事:只需指定您希望数字落入的范围即可。

    >>> def random_function(*args):
    ...     n = sum(args)
    ...     bottom = 0
    ...     for m in args:
    ...             for _ in range(m):
    ...                     yield random.uniform(bottom, bottom + m/n)
    ...             bottom += m/n
    ...
    >>> list(random_function(6,3,1))
    [0.1849778317803791, 0.2779140519434712, 0.08380168147928498, 0.5477412922676888
    , 0.5158697440011519, 0.5535466918038039, 0.8046993690361345, 0.714614514522802,
     0.7102988180048052, 0.9608096335125095]
    >>> list(random_function(6,3,1))
    [0.29313403848522546, 0.5543469551407342, 0.14208842652528347, 0.344464024804118
    7, 0.3168266508239002, 0.5956620829410604, 0.673021479097414, 0.7141779120687652
    , 0.7783099010964684, 0.9103924993423906]
    

    解释:

    给定(6,3,1),算出它们的总和 (10)。我们需要 0 到 6/10 之间的六个数字,6/10 和 6/10 + 3/10 之间的三个数字,以及 6/10 + 3/10 和 6/10 + 3/10 + 1/10 之间的一个数字。我们可以通过调用来生成这些

    random.uniform(0, 6/10) six times,
    random.uniform(6/10, 9/10) three times, and
    random.uniform(9/10, 1) once.
    

    【讨论】:

      【解决方案3】:

      嗯,这有点违背“随机”数字的目的,但 Python 确实支持这一点。

      作为random 模块(import random) 的一部分,您可以使用random.uniform(a,b) 代替random.random(),其中ab 是浮点数范围。

      Python's documentation 中的更多信息。

      【讨论】:

      • 感谢您的信息。我试过了,但似乎 random.uniform(a,b) 与 random.random() 没有太大区别... :(
      【解决方案4】:

      了解您的问题的上下文会有所帮助,但您可能正在寻找的是low-discrepancy sequences,而不是通常的伪随机数。

      更具体地说,检查 Halton 序列是否为您提供所需的结果。 Python 实现is available.

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-26
        • 1970-01-01
        相关资源
        最近更新 更多