gpt4 book ai didi

bash - Unix Shell - 为什么相同的 $RANDOM 数字会重复?

转载 作者:行者123 更新时间:2023-12-03 20:24:43 26 4
gpt4 key购买 nike

我在 Unix shell 中试验 $RANDOM 变量并注意到一些奇怪的东西。我运行了以下命令,它在循环中读取 $RANDOM 100k 次,然后将输出通过管道传输到“uniq”以查找重复项。

$ for i in {1..100000}; do echo $RANDOM; done | uniq -d
我运行了上面的命令 7 次,相同的两个数字(4455 和 4117)都重复了 7 次。下面的屏幕截图显示了命令行输出。
kali@kali:~% for i in {1..100000}; do echo $RANDOM; done | uniq -d
4455
4117
kali@kali:~% for i in {1..100000}; do echo $RANDOM; done | uniq -d
4455
4117
kali@kali:~% for i in {1..100000}; do echo $RANDOM; done | uniq -d
4455
4117
kali@kali:~% for i in {1..100000}; do echo $RANDOM; done | uniq -d
4455
4117
kali@kali:~% for i in {1..100000}; do echo $RANDOM; done | uniq -d
4455
4117
kali@kali:~% for i in {1..100000}; do echo $RANDOM; done | uniq -d
4455
4117
kali@kali:~% for i in {1..100000}; do echo $RANDOM; done | uniq -d
4455
4117
见: /image/5bpEe.png
我还打开了另一个终端窗口并重复了该过程。在第二个终端中,数字不同,但以类似的方式重复。这让我想知道 $RANDOM 变量的熵何时以及它是如何播种的。
我的猜测是每当 bash 时它都会重新播种。被调用,但我想知道是否有人知道当我在单个终端窗口中重复命令时为什么重复相同的值。

最佳答案

伪随机数生成器并不完美。 Lehmer random number generator用于 bash sources使用“标准”常量:

x(n+1) = 16807 * x(n) mod (2**31 - 1)
此外 bash 限制了 output to 15 bits only :
#  define BASH_RAND_MAX 32767
...
return ((unsigned int)(rseed & BASH_RAND_MAX));
有了种子,你的 shell 已经播种了,碰巧数字 44554117在连续输出10000个随机数中一个接一个出现。真的没有什么令人惊讶的。您可以计算种子以获得两个连续的数字,知道:
# We know that lower 15 bits of previous number are equal to 4455
x(n) mod 32768 = 4455
# We know that lower 15 bits of previous number are equal to 4455
x(n+1) mod 32768 = 4455
# We know the relation between next and previous number
x(n+1) = 16807 * x(n) mod (2**31 - 1)
# You could find x(n)

Why are the same $RANDOM numbers repeated?


因为在 shell 中使用当前种子的 bash 源中使用的伪随机生成器方法恰好重复相同的数字。

关于bash - Unix Shell - 为什么相同的 $RANDOM 数字会重复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63544826/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com