如何使用bash将变量设置为随机值


14

在程序中,我需要将变量设置为0或1的随机值。

我不知道该怎么做,而Google让我失败了。

Answers:


30

一种简单的方法是使用$RANDOM检索范围为[0; 0]的伪随机16位整数。32767]。您可以简单地将其转换为[0; 1]通过计算随机数的模2:

echo $(( $RANDOM % 2 ))

有关Bash的详细信息$RANDOMhttp : //www.tldp.org/LDP/abs/html/randomvar.html

通过这种简单的结构,您可以轻松地使用随机性来构建功能强大的脚本,例如该漫画中的...

提交地带-俄罗斯轮盘


4
我心中的学童觉得有必要指出,选择的生产服务器销毁命令将无所不能--no-preserve-root-因此也许他们所希望的俄罗斯轮盘游戏不是……
蜘蛛侠鲍里斯(Boris the Spider)

2
@BoristheSpider他们正在使用过时的$[]语法-谁知道他们是否rm具有该--no-preserve-root功能?
muru

10
@BoristheSpider我对漫画的解释是,当他们看到该消息时rm: it is dangerous to operate recursively on '/' rm: use --no-preserve-root to override this failsafe,他们垂下了头,知道自己输了游戏,就继续用光驱擦除磁盘dd
Eliah Kagan

@EliahKagan啊,seppuku。明白了
蜘蛛鲍里斯(Boris the Spider)

@BoristheSpider:--no-preserve-root仅在“最新”实现。目前尚无关于何时实施的信息,但是IIRC才刚刚成立几年。而对于Linux而言,这是微不足道的。这是关于此的票证:bugs.launchpad.net/ubuntu/+source/coreutils/+bug/174283
Apache

13

你可以用 shuf

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

     -i, --input-range=LO-HI
            treat each number LO through HI as an input line
     -n, --head-count=COUNT
            output at most COUNT lines

例:

$ foo=$(shuf -i0-1 -n1)
$ echo $foo
1
$ foo=$(shuf -i0-1 -n1)
$ echo $foo
0
$ foo=$(shuf -i0-1 -n1)
$ echo $foo
0
$ foo=$(shuf -i0-1 -n1)
$ echo $foo
1

5

怎么样:

#!/bin/bash
r=$(($RANDOM % 2))
echo $r

甚至:

r=$(($(od -An -N1 -i /dev/random) % 2))

也许:

r=$(seq 0 1 | sort -R  | head -n 1)

或者更客气地:

r=$(($(head -128 /dev/urandom | cksum | cut -c1-10) % 2))

并且:

r=$(apg -a 1 -M n -n 1 -m 8 -E 23456789  | cut -c1)

以及:

r=$((0x$(cut -c1-1 /proc/sys/kernel/random/uuid) % 2))

1

与现有答案相比,此脚本没有任何好处。仅出于娱乐目的...

从中获取一个字节/dev/urandom(尽管通常不建议向控制台发送任意二进制字符,因为它可能会产生意外/令人困惑的结果):

head -c 1 /dev/urandom

并输入十进制数字:

head -c 1 /dev/urandom | od -An -t u1

并通过2获得除法的其余部分:

echo $((`head -c 1 /dev/urandom | od -An -t u1` % 2))
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.