【问题标题】:Why do the number of iterations matter while generating the random number?为什么在生成随机数时迭代次数很重要?
【发布时间】:2020-03-06 11:36:21
【问题描述】:

我想使用给定函数f1() 生成一个随机数。我有解决方案,但我无法理解生成随机数所需的迭代次数(本例中为 5 次)。

我尝试阅读其他问题和答案,但他们专注于如何生成随机数,而不是为什么遵循特定技术。

这是我的代码:

import random


def f1():
    return(random.randint(0, 1))


def f29():
    while(1):
        Res = 0
        for _ in range(0, 5):
            Res = Res << 1 | f1()
        if(Res <= 29):
            return (Res)


print(f29())

我观察到一件事:如果我将 for 循环的范围从 5 更改为 4,则只会出现 20 以下的数字,如果将其更改为 3,则只会出现单个数字。也许我的观察是轶事。我的目标是生成 0 到 29 之间的随机数,包括使用 f1() 生成随机整数:0 或 1。

【问题讨论】:

  • 你知道&lt;&lt; 是做什么的吗?这是一个按位左移。现在以2 ** 5 == 32 为事实,您就有了解决方案。
  • 所以 Res = Res
  • @Matthias 是的,它向左移动指定的数字。您能否详细说明Now take the fact that 2 ** 5 == 32 and you have your solution.
  • 用笔和纸浏览您的代码,跟踪ResRes &lt;&lt; 1f1()。和Res &lt;&lt; 1 | f1() 用于每次迭代 - 对f() 使用抛硬币。
  • f1() 会给你01。对于最大值,我们假设它总是给我们1。在第一个循环中0 &lt;&lt; 1 | 1 给你1。第二个循环:1 &lt;&lt; 1 | 1 -> 3。第三个循环3 &lt;&lt; 1 | 1 -> 7 等等...

标签: python python-3.x math random


【解决方案1】:

这是因为您每次迭代都会对变量 Res 求和。如果f1() 返回 1,则每次迭代都有可能将Res 增加 1 位。

如果您的 f1() 始终返回 1,则该值为:
迭代 1:1
迭代 2:3
迭代 3:7
第 4 节:15

这就是为什么当您将范围从 5 更改为 4 时,您只会看到低于 20 的值。它可以是 15。

【讨论】:

    猜你喜欢
    • 2010-10-12
    • 2020-12-20
    • 2015-12-14
    • 2014-01-05
    • 2020-08-31
    • 1970-01-01
    • 2017-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多