bash - 生成无冲突的随机数

标签 bash random

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

相关文章:

bash - 如何在 Bash 中将字符串拆分为多行?

linux - 如何使用 AWK 从 nginx 访问日志中收集 IP 和用户代理信息并确定它们的基本 IP 地址?

c - 使用 C 生成随机数

go - 在不重叠的情况下在矩形上获取随机坐标

linux - 如何为 bash 脚本中的命令模拟两次连续的 ENTER 键按下?

arrays - 忽略 bash 索引数组的空元素

c++ - c++ 中的 rand() 函数生成周期为 3276800 的偶数和奇数,谁知道为什么?

matlab - 如何从矩阵中选择每一行进行不同的操作

c - 在 C 中将十六进制传递给 bash 命令

excel - 如何在 Excel 中生成两个时间段之间的随机时间段?