Spiritual

Raspberry PIによる乱数生成

あまり知られていませんが、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万円超えで乱数しか発生できない機器が売られているのに。

関連記事

  1. インテルmacのサポート終了後

  2. Audacityで音楽ファイル変換