使用种子在bash中洗牌数字

使用种子在bash中洗牌数字,bash,random,gnu-coreutils,Bash,Random,Gnu Coreutils,我想创建一个整数数组,其中的数字是1…N。每个数字在此数组中显示一次。例如,当N=5时,数组={1,3,5,2,4} 为了生成这个数组,我使用如下的shuffle方法: array=($(shuf -i 1-$N -n $N )) 它很好用。但是,我想将seed添加到此代码中,以确保每次使用相同的seed运行代码时,都得到相同的数组。可以使用shuffle方法实现吗?shuf的GNU实现有一个--random source参数。使用具有已知内容的文件名传递此参数将产生一组可靠的

我想创建一个整数数组,其中的数字是1…N。每个数字在此数组中显示一次。例如,当N=5时,数组={1,3,5,2,4}

为了生成这个数组,我使用如下的shuffle方法:

        array=($(shuf -i 1-$N -n $N ))

它很好用。但是,我想将seed添加到此代码中,以确保每次使用相同的seed运行代码时,都得到相同的数组。可以使用shuffle方法实现吗?

shuf的GNU实现有一个
--random source
参数。使用具有已知内容的文件名传递此参数将产生一组可靠的输出

请参阅GNU coreutils手册中的文档,其中包含以下示例实现:

get_seeded_random()
{
种子=“$1”
openssl enc-aes-256-ctr-通过:“$seed”-nosalt\
/dev/null
}
shuf-i1-100——仅在bash中使用random source=(不使用外部工具,如
shuf
openssl
,您可以使用
$random
,您可以使用伪随机输入,如下所示:

RANDOM=$$

等等

您可以使用
{1..N}
等表达式选择一系列数字

declare -a a=()
for n in {1..5}; do
    a[$RANDOM]=$n
done
echo "${a[@]}"
上述编码的解决方案在重复随机值的情况下具有非零的故障风险,可通过一些额外的代码来缓解,或通过扩展随机范围来减少,例如使用位移位来生成30位无符号整数,而不是15位无符号整数:

...
    a[$(( (RANDOM<<15)+RANDOM ))]=$n
...

具体的实现<代码> SUF?BTW,这实际上不是一个很好的读取数组的方法;如果在BASH 4或更新,或者<代码> IFS= $'\n′-R-D′-数组,不管是GNU<代码> SUF<<代码>,请考虑<代码>(我们不知道,因为
shuf
不是bash的一部分,而是一个单独发布的工具),那么
--随机源
就可以了。(嗯,恼人的是--我们在上周有一个重复的问题,但是OP发现
--随机源
存在时删除了它,因此无法链接到它)。谢谢,我正在使用bash 4.3,它工作得非常好。非常感谢您的帮助。
RANDOM=$(date '+%s')
declare -a a=()
for n in {1..5}; do
    a[$RANDOM]=$n
done
echo "${a[@]}"
...
    a[$(( (RANDOM<<15)+RANDOM ))]=$n
...
$ a=(); for n in {1..5}; do a[$RANDOM]=$n; done; declare -p a
declare -a a=([7460]="5" [12697]="3" [16841]="2" [21485]="1" [32493]="4")
$ a=(); for n in {1..5}; do a[$RANDOM]=$n; done; declare -p a
declare -a a=([1444]="1" [12162]="2" [17774]="3" [29827]="4" [31840]="5")