加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

bash – 生成没有冲突的随机数

发布时间:2020-12-16 01:33:35 所属栏目:安全 来源:网络整理
导读:我想在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个数字,但
我想在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

这里拒绝是隐含的,再次添加相同的数字不会增加数组大小(本质上是一个哈希映射)

例如,可以将结果分配给变量,但结构需要使用数组

declare -a randarray
readarray randarray < <(seq 48 | shuf | head -6)

您可以使用相应的索引访问各个元素(从0开始)

echo ${randarray[3]}

一般来说,如果您的样本数量接近样本空间的范围,您将需要随机播放(极端情况下,如果您想要1-N范围内的N个数字,您要求的是随机排列),或者如果比率很小,拒绝抽样可能更好,(极端情况下你想要一个随机变量).如果您有其他条件来消除样品,则主要使用拒绝取样.但是,直接使用带选项的shuf已经非常快了,基本用途根本不需要拒绝采样方法.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读