bashを使用して変数をランダムな値に設定する方法


14

プログラムでは、変数を0または1のランダムな値に設定する必要があります。

どうすればいいかわからず、Googleは失敗しました。

回答:


30

簡単な方法の1つ$RANDOMは、範囲[0;の擬似乱数16ビット整数を取得することです。32767]。これを単に[0;に変換できます。1]乱数の2を法とする計算:

echo $(( $RANDOM % 2 ))

Bashの詳細$RANDOMhttp : //www.tldp.org/LDP/abs/html/randomvar.html

この単純な構造を使用すると、このコミックのように、ランダム性を使用して強力なスクリプトを簡単に構築できます...

コミットストリップ-ロシアンルーレット


4
私の中でPEDANTコマンドを破壊選ばれた本番サーバがなくて何もしないであろうことを指摘する必要が感じている--no-preserve-root-彼らが望んでいたロシアのルーレットのようにそうでないかもしれないゲームを...
ボリス・スパイダー

2
@BoristheSpider彼らは時代遅れの$[]構文を使用しています- rmその--no-preserve-root機能があったかどうか誰が知っていますか?
ムル

10
@BoristheSpiderコミックの私の解釈では、メッセージを見たときrm: it is dangerous to operate recursively on '/' rm: use --no-preserve-root to override this failsafe、頭を下げて、ゲームに負けたことを知り、でディスクを消去しddます。
エリアケイガン

@EliahKaganああ、切腹。わかった。
スパイダーボリス

@BoristheSpider:--no-preserve-root実装されたのは「最近」だけです。いつ実装されたかについての情報はありませんが、IIRCはほんの数年前のものです。そして、Linuxに関して言えば、それはごくわずかです。これに関するチケットを次に示します。bugs.launchpad.net
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

このスクリプトには、既存の回答に対する利点はありません。娯楽目的のためだけに...

から1バイトを取得します/dev/urandom(ただし、一般に、任意のバイナリ文字をコンソールに送信することはお勧めできません™。予期しない/混乱した結果になる可能性があります)。

head -c 1 /dev/urandom

そして、10進数に変換します。

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

そして、その除算の残りを2で取得します。

echo $((`head -c 1 /dev/urandom | od -An -t u1` % 2))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.