我想在 bash 中生成不同的随机数。我使用了 $RANDOM ,但在我的输出中一些数字是相同的。
var1=$((1+$RANDOM%48))
var2=$((1+$RANDOM%48))
var3=$((1+$RANDOM%48))
var4=$((1+$RANDOM%48))
var5=$((1+$RANDOM%48))
var6=$((1+$RANDOM%48))
它给了我 1 到 48 之间的 6 个数字,但我需要 1 到 48 之间的 6 个不同数字,事实是我真的很新,我什至不知道如何开始。
最佳答案
如果你想要 1-48 之间的 6 个不同的伪随机数,这是实现它的一种方法
$ seq 48 | shuf | head -6
18
10
17
3
11
6
或直接使用 shuf
选项(如 this answer )
shuf -i 1-48 -n 6
另一种方法是拒绝抽样。使用 awk
awk 'BEGIN{srand();
do {a[int(1+rand()*48)]} while (length(a)<6);
for(k in a) print k}'
8
14
16
23
24
27
这里拒绝是隐含的,再次添加相同的数字不会增加数组大小(本质上是 HashMap )
将结果分配给变量是可能的,但是该结构要求使用数组,例如
declare -a randarray
readarray randarray < <(seq 48 | shuf | head -6)
您可以访问具有相应索引(从 0 开始)的各个元素
echo ${randarray[3]}
一般来说,如果您的样本数量接近样本空间的范围,您将需要随机排列(极端情况下,如果您想要 1-N 范围内的 N 个数字,您要求的是随机排列),或者如果比率很小,拒绝抽样可能会更好(极端情况下您需要一个随机变量)。如果您有其他条件可以排除样本,则主要使用拒绝抽样。但是,直接使用带选项的 shuf
已经非常快了,对于基本用途,您可能根本不需要拒绝抽样方法。
关于bash - 生成无冲突的随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46943836/