如何在Bash中生成一个范围内的随机数?


当前回答

基于@Nelson, @Barun和@Robert的精彩回答,这里有一个生成随机数的Bash脚本。

可以生成你想要的数字。 每个数字都是由/dev/urandom单独生成的,这比Bash内置的$RANDOM要好得多

#!/usr/bin/env bash

digits=10

rand=$(od -A n -t d -N 2 /dev/urandom |tr -d ' ')
num=$((rand % 10))
while [ ${#num} -lt $digits ]; do
  rand=$(od -A n -t d -N 1 /dev/urandom |tr -d ' ')
  num="${num}$((rand % 10))"
done
echo $num

其他回答

也许我说得有点晚了,但是在Bash中使用jot生成一个范围内的随机数怎么样?

jot -r -p 3 1 0 1

这将生成一个随机的(-r)数字,具有3位小数点后精度(-p)。在本例中,您将得到0到1(1 0 1)之间的一个数字。您还可以打印顺序数据。根据手册,随机数的来源为:

当没有指定种子时,通过arc4random(3)获得随机数,通过 随机(3)当一个种子给出。

我就此写了几篇文章。

https://linuxconfig.org/generating-random-numbers-in-bash-with-examples https://linuxconfig.org/random-entropy-in-bash https://www.cloudsavvyit.com/7572/how-to-generate-better-random-numbers-at-the-bash-command-line/

$ RANDOM=$(date +%s%N | cut -b10-19)
$ echo $(( $RANDOM % 113 + 13 ))

上述将给出一个介于13到125(113-1+13)之间的数字,具有合理的随机熵。

生成0到n范围内的随机数(有符号的16位整数)。$RAND变量中的结果集。例如:

#!/bin/bash

random()
{
    local range=${1:-1}

    RAND=`od -t uI -N 4 /dev/urandom | awk '{print $2}'`
    let "RAND=$RAND%($range+1)"
}

n=10
while [ $(( n -=1 )) -ge "0" ]; do
    random 500
    echo "$RAND"
done

生成随机的3位数字

这对于创建示例数据非常有用。示例:将所有测试数据放在名为“test-create-volume-123”的目录中,然后在测试完成后,删除整个目录。通过生成恰好三个数字,就不会有奇怪的排序问题。

printf '%02d\n' $((1 + RANDOM % 100))

这是按比例缩小的,例如到一个数字:

printf '%01d\n' $((1 + RANDOM % 10))

它可以放大,但只能放大到四位数。原因见上文:)

程序的随机分支或是/否;1/0;真/假输出:

if [ $RANDOM -gt 16383  ]; then              # 16383 = 32767/2 
    echo var=true/1/yes/go_hither
else 
    echo var=false/0/no/go_thither
fi

如果你懒得记16383年

if (( RANDOM % 2 )); then 
    echo "yes"
else 
    echo "no"
fi