Linux
 Computer >> コンピューター >  >> トラブルシューティング >> Linux

Bashで乱数を生成する4つの方法:コマンドライン活用ガイド

Bashのプロンプトからは簡単に乱数を生成でき、その数値をそのまま変数に設定することもできます。これは特定の種類のスクリプト作成から、テーブルトップRPGのセッション運営まで、幅広い場面で役立ちます。D&Dキャンペーンの準備でも、強力なbash言語を使ったユーティリティ開発でも、多くの場合たった1行のコードで済みます。また、特定のセキュリティチェックを行う際にも便利なツールですが、熟練したクラッカーであればこうした単純な乱数生成器を回避できる点には留意が必要です。それでも、パスワードやコードの生成には十分有用であり、セキュリティ維持の一助となるでしょう。

乱数の生成方法はいくつかあり、すべての状況に適した手法が存在するわけではありません。そこで本記事では、それぞれの方法を実際に検証し、動作することを確認しました。作業はターミナル上で行います。Ctrl+Alt+TまたはSuper(Windows)キー+Tでグラフィカル端末を開くか、Dashに「terminal」と入力して起動するか、アプリケーションメニューやWhiskerメニュー、システムツールから選択してください。あるいはCtrl+Alt+F1〜F6のいずれかで仮想端末に直接切り替えても構いません。

方法1:完全なランダムバイトを取得する

次のコマンドをbashプロンプトから直接実行すると、1〜256の範囲で乱数を生成できます。

od -An -N1 -tu1 /dev/urandom

このコマンドが /dev/urandom の代わりに /dev/random を参照している例を見かけることもありますが、その方法での実行は避けたほうが無難です。使用中に他のプログラムが乱数シードジェネレーターへアクセスできなくなるといった、意図しない影響を与える可能性があります。数値を取得したら、次のように変数に代入することもできます。

ranNum=$(($(od -An -N1 -tu1 /dev/urandom)))

これにより、変数ranNumに実行時点で選ばれた1〜256の数値が設定されます。コマンドラインからでもスクリプト内からでも問題なく動作します。なお、ranNumは任意の有効な変数名に置き換え可能です。

方法2:1〜任意の上限値までの乱数を変数に設定する

コマンドラインで echo $[RANDOM%40+1] を実行すると、1〜40の乱数が標準出力に出力されます。コマンド内の「40」は実質的に任意の数値に置き換えられます。理論上はホストマシンのアーキテクチャやbash自体の上限に達しますが、それほど大きな数値が必要になることはまずないでしょう。

例えば、変数設定用に1〜10の乱数を生成したい場合は、次のように実行します。

ranNum=$[RANDOM%10+1]

「10」は任意の最大値に置き換えられます。この値は範囲に含まれるため、10も結果として返されます。上限を1つ下げたい場合は、C言語やC++スタイルの「-1」演算を使わず、単純に値を9にしてください。この方法で変数を設定する際にそのような演算は不要であり、むしろ桁の加減算によって予期しない結果を招くことがあります。

方法3:単一のランダムビットを選択する

0か1のランダムなビットを変数に設定したい場合は、先ほどのコードを次のように変更します。

ranNum=$(($(od -An -N1 -i /dev/urandom) % 2))

このコードは、/dev/urandomファイルからサンプリングした数値の偶奇に応じて、ranNumに1または0を設定します。「はい/いいえ」のような二択の状態を扱いたい場合に便利です。

十分なランダム性が得られないと感じる場合は、/proc/sys/kernel/randomディレクトリを利用することで、さらにランダム性の高い数値を取得できます。

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

ただしこちらも、変数には1か0しか設定されません。バイナリロジックには理想的ですが、より長い数値が必要な場面では使い勝手が劣ります。とはいえ、これらのコマンドは必要に応じてbashスクリプト内でも使用できます。最初の方法がうまく機能しない場合、この2番目の方法が有効なこともあります。

方法4:乱数を返すBashスクリプトを作成する

いつでも乱数を生成できる便利なツールが欲しいなら、コマンドラインスクリプトを作成しましょう。現代のほとんどのLinux環境が備える標準的なbash言語だけで実現できるため、ほぼすべての最新Linuxディストリビューションや、多くのBSD系OSでも問題なく動作します。どこからでも実行できる場所にスクリプトを配置するため、作業前に cd ~/.local/bin を実行しておくとよいでしょう。

nano random または vi random と入力して編集を開始します(スクリプト名は自由に変更可能で、お好みのテキストエディタを使っても構いません)。例えば、コマンドラインで呼び出すと1か0を返すスクリプトを作成したいとします。nanoの場合は以下を入力し、Ctrl+Oで保存してください。

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

Ctrl+Xでエディタを終了し、コマンドラインに戻ったら chmod +x random を実行してスクリプトを実行可能にします。ranNum=$(($RANDOM % 2)) の部分は、ranNum=$[RANDOM%10+1] や ranNum=$(($(od -An -N1 -tu1 /dev/urandom))) など、任意の処理に置き換えられるため、返したい数値の種類を細かく制御できます。例えば、1〜50の乱数を頻繁に取得したい場合は、スクリプトの内容を次のように変更します。

#!/bin/bash
ranNum=$[RANDOM%50+1]
echo $ranNum

これで準備完了です。乱数が必要になったときに、コマンドラインで「random」と入力するだけでいつでも実行できます。

著者について

Bashで乱数を生成する4つの方法:コマンドライン活用ガイド

Kevin Arrows(ケビン・アローズ)

ケビン・アローズは、10年以上の業界経験を持つテクノロジースペシャリストです。Microsoft認定テクノロジースペシャリスト(MCTS)の資格を保有し、最新の技術動向を追いかけることに強い情熱を注いでいます。ソフトウェア開発、サイバーセキュリティ、クラウドコンピューティングなど、幅広い技術分野について多数の記事を執筆しており、その専門性は業界内で高く評価されています。複雑な技術的概念を明快かつ簡潔に解説する能力でも定評があります。

  1. 1つのコマンドですべてのLinuxシェルコマンドを一覧表示する方法

    実は、Linuxシェルが認識しているすべてのコマンドを一覧表示できるコマンドが存在します。しかし、その存在を知っているユーザーは意外と少ないのが現状です。GNU/LinuxベースのOSのコマンドライン操作において、これほど逆説的な「キャッチ22」は他にないでしょう。とはいえ幸いなことに、シェルが直接教えてくれなくても、このコマンドを習得するのは非常に簡単です。 まず、Ctrl+Alt+Tキーを押してコマンドライン(端末)を開きましょう。Xfce4、KDE、LXDEを使用している場合は、アプリケーションメニューから「システムツール」をクリックし、「端末」を選択します。Ubuntu Unityの場

  2. UDFボリュームをUbuntuにマウントする方法:ステップバイステップガイド

    UDF(Universal Disk Format)とは?Universal Disk Format(UDF)は、コンピューターのデータ保存に関するISO 13346およびECMA-167のベンダーニュートラルな規格です。実務では主にDVDの作成に使用されますが、内蔵ディスクをUDFでフォーマットすること自体は何の制約もありません。より実用的な用途としては、CD-RWやDVD-RW/DVD+Rなどの光学メディアに採用されており、ユーザーがファイルを自由に追加・削除できるようになっています。さらに、一部の業務用ハイエンドデジタルビデオカメラでは、やや特殊なDVD-RAM形式が使用されることもあり