在Bash中,RANDOM和SRANDOM的区别是什么?

4

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

来自手册

RANDOM

每次引用此参数时,它都会扩展为0到32767之间的随机整数。给这个变量赋值会启动随机数生成器。如果未设置RANDOM,则即使稍后重置它,它也会失去其特殊属性。

SRANDOM

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

我不理解“非线性”和“种子处理”的含义,但是针对我的例子是否有必要使用RANDOM还是SRANDOM,有差别吗?

1个回答

8

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

至于这两个变量的随机性...

尝试运行:

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 fiddle示例!
另一个测试:
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的注释……

正如詹姆斯·K·波尔克总统在他的评论中提到的,'linear'可能指的是RANDOM生成其不太随机的数据的基础算法。

考虑到RANDOM输出可以预先确定(给定一个起始点,即seed),我可能会用更接近于'deterministic'的东西代替'linear'......


总之,如果需要重复一系列“随机”数字,请使用RANDOM;如果需要生成一组真正随机的数字,请使用SRANDOM


1
关于“linear”注释,如果连续的值是线性相关的,它们是相关的,使得序列更容易预测。 - pjs
4
同样重要的是,由于种子的缘故,RANDOM 可以用来创建可以精确复现的结果,这对于调试和验证非常方便。而使用 SRANDOM 就无法做到这一点,其结果总是会有所不同。 - kvantour
就大小而言,“RANDOM”是一个16位有符号正整数(0-32767),而“SRANDOM”实际上是一个32位无符号整数。最好写成这样:_RANDOM(15位无符号)和SRANDOM(32位无符号)_。 - Bruno

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接