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
Run Code Online (Sandbox Code Playgroud)
从手册:
随机的
每次引用此参数时,它都会扩展为 0 到 32767 之间的随机整数。为该变量分配一个值会为随机数生成器提供种子。如果 RANDOM 未设置,它会失去它的特殊属性,即使它随后被重置
随机
每次引用此变量时,它都会扩展为 32 位伪随机数。随机数生成器在支持 /dev/urandom 或 arc4random 的系统上不是线性的,因此每个返回的数字与其前面的数字没有关系。随机数生成器无法播种,因此对该变量的赋值无效。如果 SRANDOM 未设置,它会失去它的特殊属性,即使它随后被重置。
我不明白non-linear和seeding是什么意思,但对于我的例子,是否有理由使用RANDOM
overSRANDOM
或反之亦然,或者它没有任何区别?
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
Run Code Online (Sandbox Code Playgroud)
您应该会发现每个循环都会生成相同的“随机”数字集:
18499
9909
24640
15572
5516
17897
19000
12793
27730
5509
Run Code Online (Sandbox Code Playgroud)
这是上面的bash 小提琴,它生成完全相同的输出!
另一个测试:
RANDOM=5; echo $RANDOM $RANDOM
RANDOM=5; echo $RANDOM $RANDOM
RANDOM=5; echo $RANDOM $RANDOM
Run Code Online (Sandbox Code Playgroud)
反复生成:
18499 9909
Run Code Online (Sandbox Code Playgroud)
现在重复这个测试,但是SRANDOM
你会发现你不能做种子SRANDOM
,因此每次迭代都会生成一组不同的“随机”数字。
SRANDOM=5; echo $SRANDOM $SRANDOM
SRANDOM=5; echo $SRANDOM $SRANDOM
SRANDOM=5; echo $SRANDOM $SRANDOM
Run Code Online (Sandbox Code Playgroud)
这会生成 3 组不同的输出:
1355214790 3304840972
4217276959 255499591
446827805 3301635911
Run Code Online (Sandbox Code Playgroud)
注意:感谢oguz ismail的SRANDOM
输出。
至于linear
评论...
正如总裁 James K Polk在他的评论中提到的那样,'linear'
可能是指RANDOM
生成非随机数据的底层算法。
看看如何RANDOM
事先确定输出(给定一个起点,又名seed
),我可能会'linear'
用更多的东西替换'deterministic'
......
RANDOM
最终结果……如果您需要重复一系列“随机”数字,请使用……SRANDOM
如果您需要生成一组真正的随机数,请使用。