gpt4 book ai didi

bash - 生成无冲突的随机数

转载 作者:行者123 更新时间:2023-11-29 08:59:30 25 4
gpt4 key购买 nike

我想在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com