あまり知られていませんが、Raspberry PIは数年前から乱数生成器が付属しています。
いろいろ調べるとARM社のプロセッサーの多くに乱数発生器は組み込まれていて、BCM2835も同様だということです。
正確なメカニズムは私が調べたかぎりではわかりません。ドキュメントされていないようで、おそらく熱雑音(抵抗内の電子がもたらす雑音で、どんな抵抗器も必ずもつ)を利用したものだろうということです。
批判もありますが、ソフトウェアで生成された乱数とされる数字はどこまでいっても疑似乱数であるといことは定義上、仕方ありません。物理的な乱数発生器というものは決定的に違います。
この間から使っている小さいRaspberry PI Zeroも同様にもっていて、Raspbian OSだと /dev/hwrngとしてアクセスできます。Pythonからでは以下のプログラムとなります。
with open("/dev/hwrng", "rb") as f: data = f.read(8) # read 8 random bytes num = int.from_bytes(data, "big") print(num)
ただ、/dev/hwrngを直接オープンするので、sudoしないと動作できません。
Raspbian OSではhwrngというDaemonが動作しているはずです。
これによりPythonの標準関数os.urandom()から/dev/hwrngデータを入手できます。
単純な例ですと、0か1をランダムに得たいならば次のコードとなります。
import os random_byte = os.urandom(1) random_bit = random_byte[0] & 1 # Extract least significant bit print(random_bit) # Will be either 0 or 1
もう少し長いデータが欲しい場合(16ビット)
import os num_bits = 16 # number of random bits num_bytes = (num_bits + 7) // 8 # calculate needed bytes random_bytes = os.urandom(num_bytes) # Convert each bit into a 0 or 1 value bits = [] for byte in random_bytes: for i in range(8): bits.append((byte >> i) & 1) # Trim extra bits if any bits = bits[:num_bits] print(bits) # [0, 1, 1, 0, ...]
こんなに簡単に安価に本当の乱数が発生できるんですよ。
Amazon見たら1万円超えで乱数しか発生できない機器が売られているのに。