如何在命令行中获得随机性?


11

如何在指定的命令列表中随机执行一个命令?有助于随机选择启动声音,墙纸或执行命令。

通常,如果我有以下执行命令,那么如何获得随机性:?

#!/bin/bash
<command_1>
<command_2>
<command_3>
.
.
.
<command_n>

然后,当脚本运行时,我想从上述可能性中仅随机执行一个命令

怎么做?



@Parto我之前已经添加为答案
Pandya

我没有试图回答,只是举了一个可以使用它的示例。
Parto 2014年

Answers:


21

变量$RANDOM(实际上是bash函数)返回0到32767(含)之间的随机数。

您通常希望通过将其除以某个数字并取其余数来限制其范围,例如。

# output a random number 0 to 3
echo $((RANDOM % 4))

在这个简单的示例中,对于任何不均分为32768的除数(例如,任何不是2的幂的数),都会有轻微的偏差,但是在您的情况下,我认为您不会感到麻烦略有偏差。

要选择随机文件,您可以将文件命名为:

file0.jpg
file1.jpg
file2.jpg
file3.jpg

然后您可以选择一个随机的

# output a random file from file0.jpg to file3.jpg
echo "file$((RANDOM % 4)).jpg"

1
您可能希望将其发布为自己的答案-这样可以赢得声誉。
thomasrutter 2014年

有用RANDOM,我接受了!
潘迪2014年

1
请注意,除非RANDOM的可能值数目(32768)被N整除,否则RANDOM%N不会产生均等的分布。要看到这一点,可以想象一下RANDOM的范围是0-4(5个可能的值),并且N为2:有三种方式让$ RANDOM%2产生0(如果$ RANDOM产生0、2、4),但是有两种方式使它产生1(1、3)。对于相等的分布,您必须找到小于32767的N的最大倍数,并忽略大于此值的任何随机值。在前面的示例中,忽略5大于
4。– Doval

@Doval我在回答中说过,您看到了吗?
thomasrutter 2014年

@neon_overload不好,我错过了这一点。
2014年

7

根据@neon_overload答案(使用RANDOM),
我可以将RANDOM示例脚本如下所示(用于4个命令):

#!/bin/bash
random_selection=$((RANDOM % 4))

case $random_selection in

  0)
  <command_1>
  ;;

  1)
  <command_2>
  ;;

  2)
  <command_3>
  ;;

  3)
  <command_4>
  ;;

esac

2

如果要通过外部站点而不是计算机生成的外部站点进行随机性检查,则可以使用以下脚本:

curl "http://www.random.org/integers/?num=1&min=$1&max=$2&col=1&base=10&format=plain&rnd=new"

以rand(MIN)(MAX)运行(假设另存为/ usr / bin / rand)

如果尚未安装curl,则可能必须先安装curl(sudo apt-get install curl)。


0

您可以使用shuf来自GNU coreutils的命令。

NAME
       shuf - generate random permutations

SYNOPSIS
       shuf [OPTION]... [FILE]
       shuf -e [OPTION]... [ARG]...
       shuf -i LO-HI [OPTION]...

DESCRIPTION
       Write a random permutation of the input lines to standard output

例:

$ shuf -i 1-5
4
1
2
5
3

$ shuf -e Debian Ubuntu Trisquel 
Trisquel
Debian
Ubuntu

现在,要获得一个随机条目,您可以使用-n 1输出第一行。

从1到100的随机数打印示例:

$ shuf -i 1-100 -n 1
37

如果您file具有以下内容:

$ cat file
command-1
command-2
command-3
command-4
command-5

您还可以执行以下操作:

$ shuf file -n 1
command-3
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.