Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在bashshell脚本中生成1到10之间的随机数_Bash_Gnu - Fatal编程技术网

在bashshell脚本中生成1到10之间的随机数

在bashshell脚本中生成1到10之间的随机数,bash,gnu,Bash,Gnu,如何在bashshell脚本中生成1到10之间的包含随机数 是不是$(随机1+10) 编辑。根据注释将括号更改为括号。 要使用bash生成随机数,请使用$random internal bash函数。请注意,$RANDOM不应用于生成加密密钥$RANDOM是使用当前进程ID(PID)和当前时间/日期(由1970年以来经过的秒数定义)生成的 echo $RANDOM % 10 + 1 | bc 您还可以使用/dev/uradom: grep -m1 -ao '[0-9]' /dev/urand

如何在bashshell脚本中生成1到10之间的包含随机数

是不是
$(随机1+10)

编辑。根据注释将括号更改为括号。

要使用bash生成随机数,请使用$random internal bash函数。请注意,$RANDOM不应用于生成加密密钥$RANDOM是使用当前进程ID(PID)和当前时间/日期(由1970年以来经过的秒数定义)生成的

 echo $RANDOM % 10 + 1 | bc

您还可以使用/dev/uradom:

grep -m1 -ao '[0-9]' /dev/urandom | sed s/0/10/ | head -n1

要在以下范围内生成:{0,…,9}

r=$($RANDOM%10));echo$r


要在以下范围内生成:{40,…,49}


r=$($RANDOM%10+40));echo$r

最简单的解决方案是使用允许您直接指定范围的工具,如
shuf

shuf -i1-10 -n1
如果您想使用
$RANDOM
,则更精确的方法是抛出0…32767中的最后8个数字,并将其视为0…32759,因为采用0…32767 mod 10可以得到以下分布

0-8 each: 3277 
8-9 each: 3276
所以,稍微慢一点,但更精确一点

while :; do ran=$RANDOM; ((ran < 32760)) && echo $(((ran%10)+1)) && break; done 
while:;doran=$RANDOM;((ran<32760))&&echo$((ran%10)+1))&&break;完成

这里是在$random和/dev/uradom都不可用时的伪随机生成器示例

echo$(日期+%S)| grep-o.$| sed S/0/10/


这适用于我需要的
导出CUDA\u VISIBLE\u DEVICES=$((随机%8))
我得到一个语法错误:Linux上意外标记“+”附近的语法错误
%10
将结果减少到一组范围0-9。然而,最顶级的设置只有0-7的范围。因此,8和9的绘制比0-7少两次。+1表示对9和10的偏差。这将是安全上下文中的一个主要缺陷——RNG不能显示偏差,在规模上这是显而易见的。进一步解释:.@BradKoch我们如何知道Bash的RNG会产生这个错误?@ads20000文档这样说,
manbash
,“每次引用这个参数时,都会生成一个介于0和32767之间的随机整数。”请注意,这不是Bash错误,而是实现者的错误。假设bash正确地实现了
$RANDOM
,那么从数字0到32767之间应该有一个公平的平局,但是因为您不能将其平均分成10组,所以在这个实现中对9和10有一个非常小的偏差。大多数人不必担心这一点,因为无论如何你都不应该出于安全目的使用
$RANDOM
。到目前为止,当你没有可用的$RANDOM时,最简单的解决方案是有用的,即busyboxquire trick
sed s/0/10/
!我发现$RANDOM不能生成大的数字,所以我使用
date+%s
来获得一个大的数字
echo$(date+%s)%4 | bc
这个“|bc”部分做什么?@ebi
echo
只是打印字符串(变量替换发生在命令处理之前,因此,
$RANDOM
已经被该点的整数替换),
bc
是当
|
将stdout从
echo
重定向到
bc
的stdin时实际计算它的值,在Mac OS X上运行得很好。+1每次运行它时,它只会打印一个递增的数字序列:“1…2…3…4…”,当前秒的最低有效位。日期完全不是随机的。它是完全可预测的,并且遵循一个明显的模式。
while :; do ran=$RANDOM; ((ran < 32760)) && echo $(((ran%10)+1)) && break; done