Bash中RANDOM和SRANDOM的区别

Bash 5.1 引入了SRANDOM变量,但是这样使用有什么区别吗?

for i in {1..10}; do
  nbr=$((RANDOM%50))
  nbr1=$((SRANDOM%50))
  echo "$nbr -- $snbr"
done
9 -- 21
35 -- 43
27 -- 15
7 -- 24
41 -- 31
37 -- 35
23 -- 47
14 -- 23
9 -- 37
6 -- 30

从手册:

随机的

每次引用此参数时,它都会扩展为 0 到 32767 之间的随机整数。为该变量分配一个值会为随机数生成器提供种子。如果 RANDOM 未设置,它会失去它的特殊属性,即使它随后被重置

随机

每次引用此变量时,它都会扩展为 32 位伪随机数。随机数生成器在支持 /dev/urandom 或 arc4random 的系统上不是线性的,因此每个返回的数字与其前面的数字没有关系。随机数生成器无法播种,因此对该变量的赋值无效。如果 SRANDOM 未设置,它会失去它的特殊属性,即使它随后被重置。

我不明白non-linearseeding是什么意思,但对于我的例子,是否有理由使用RANDOMoverSRANDOM或反之亦然,或者它没有任何区别?

回答

RANDOM(16 位)与SRANDOM(32 位);32 位 => 更大的随机数(即更多的随机数)。

至于 2x 变量的随机性......

尝试运行:

RANDOM=5; for i in {1..10}; do echo $RANDOM; done
RANDOM=5; for i in {1..10}; do echo $RANDOM; done
RANDOM=5; for i in {1..10}; do echo $RANDOM; done

您应该会发现每个循环都会生成相同的“随机”数字集:

18499
9909
24640
15572
5516
17897
19000
12793
27730
5509

这是上面的bash 小提琴,它生成完全相同的输出!

另一个测试:

RANDOM=5; echo $RANDOM $RANDOM
RANDOM=5; echo $RANDOM $RANDOM
RANDOM=5; echo $RANDOM $RANDOM

反复生成:

18499 9909

现在重复这个测试,但是SRANDOM你会发现你不能做种子SRANDOM,因此每次迭代都会生成一组不同的“随机”数字。

SRANDOM=5; echo $SRANDOM $SRANDOM
SRANDOM=5; echo $SRANDOM $SRANDOM
SRANDOM=5; echo $SRANDOM $SRANDOM

这会生成 3 组不同的输出:

1355214790 3304840972
4217276959 255499591
446827805 3301635911

注意:感谢oguz ismail的SRANDOM输出。


至于linear评论...

正如总裁 James K Polk在他的评论中提到的那样,'linear'可能是指RANDOM生成非随机数据的底层算法。

看看如何RANDOM事先确定输出(给定一个起点,又名seed),我可能会'linear'用更多的东西替换'deterministic'......


RANDOM最终结果……如果您需要重复一系列“随机”数字,请使用……SRANDOM如果您需要生成一组真正的随机数,请使用。

  • Also important, `RANDOM`, due to the seed, can be used to create.resulta that can be reproduced exactly which is handy for debugging and verification. With `SRANDOM` this is not possible. Results will be always different one way or another.

以上是Bash中RANDOM和SRANDOM的区别的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>