gpt4 book ai didi

python - random.random 到底在做什么

转载 作者:太空宇宙 更新时间:2023-11-04 07:04:23 29 4
gpt4 key购买 nike

    random.shuffle(lst_shuffle, random.random)

我知道后一部分是可选参数。但它究竟做了什么。我不明白这是什么意思。
这是来自文档。

random.random()¶ Return the next random floating point number in the range [0.0, 1.0).



我也看到了,这就是这个范围 0,0, 1,0 的意思吗?
Pseudorandom number generators
Most, if not all programming languages have libraries that include a pseudo-random
number generator. This generator usually returns a random number between 0 and 1 (not
including 1). In a perfect generator all numbers have the same probability of being selected but
in the pseudo generators some numbers have zero probability.

最佳答案

现有答案很好地解决了问题的具体问题,但我认为值得一提的是一个附带问题:为什么您特别有可能希望将替代“随机生成器”传递给 shufflerandom 中的其他功能相反模块。报价 the docs :

Note that for even rather small len(x), the total number of permutations of x is larger than the period of most random number generators; this implies that most permutations of a long sequence can never be generated.



这里的短语“随机数生成器”指的是更迂腐的说法 。伪 - 随机数生成器——可以很好地模拟随机性,但完全是算法的生成器,因此被称为 不是 是“真正随机的”。任何这样的算法方法都会有一个“周期”——它最终会开始重复。

Python的 random模块使用了一个特别好的和经过充分研究的伪随机生成器, Mersenne Twister , 期间为 2**19937-1 -- 以十进制数字写出时超过 6000 位的数字,如 len(str(2**19937-1))将确认;-)。在我的笔记本电脑上,我每秒可以生成大约 500 万个这样的数字:
$ python -mtimeit -s'import random' 'random.random()'
1000000 loops, best of 3: 0.214 usec per loop

假设一台速度更快的机器每秒能够产生十亿个这样的数字,那么这个循环将需要大约 105985 年才能重复——而目前对宇宙年龄的最佳估计略小于 1.5*1012 年。因此,要达到重复点需要几乎无法想象的宇宙生命周期;-)。使计算并行并没有多大帮助。据估计,宇宙中大约有 1080 个原子,所以即使你能够在宇宙中的每个原子上运行这样一个每秒十亿的发生器,它仍然需要超过 105800 个宇宙生命周期才能开始重复。

因此,您可能有理由怀疑这种对重复的担心只是一个理论问题,而不是实际问题;-)。

尽管如此,阶乘(计算长度为 N 的序列的排列)也增长得相当快。例如,Mersenne Twister 可能能够产生长度为 2080 的序列的所有排列,但绝对不能产生长度为 2081 或更高的序列。如果不是因为“宇宙的生命周期”问题,文档对“甚至相当小的 len(x)”的担忧是有道理的——我们 了解只要我们有一个相当长的序列,就永远无法通过使用这样的伪 RNG 进行改组来达到许多可能的排列,所以人们可能会担心我们实际上会通过几次改组来引入什么样的偏差!:-)

os.urandom调解对操作系统提供的任何物理随机源的访问 -- CryptGenRandom在 Windows 上, /dev/urandom在 Linux 等 os.urandom给出字节序列,但在 struct 的帮助下很容易将它们变成随机数:
>>> n = struct.calcsize('I')
>>> def s2i(s): return struct.unpack('I', s)[0]
...
>>> maxi = s2i(b'\xff'*n) + 1
>>> maxi = float(s2i(b'\xff'*n) + 1)
>>> def rnd(): return s2i(os.urandom(n))/maxi

现在我们可以调用 random.shuffle(somelist, rnd)少担心偏见;-)。

不幸的是,测量表明这种 RNG 方法比调用 random.random() 慢大约 50 倍。 - 如果我们需要许多随机数,这可能是一个重要的实际考虑因素(如果我们不需要,那么担心可能存在的偏差可能会放错地方;-)。 os.urandom方法也很难以可预测、可重复的方式使用(例如,用于测试目的),而使用 random.random()您只需要提供一个固定的首字母 random.seed在测试开始时,以保证可重现的行为。

因此,在实践中, os.urandom仅在您需要“加密质量”随机数时使用 - 确定的攻击者无法预测的随机数 - 因此愿意为使用它而不是 random.random 支付实际价格.

关于python - random.random 到底在做什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1961340/

29 4 0
文章推荐: HTML - 在不破坏其他