ランダム

場合によっては、偶然な要素を入れたい、または少し混ぜたいことがあります: デバイスをランダムに動作させたいことがあるでしょう。

MicroPython には random モジュールがあり、コードに偶然と少し混乱を導入できます。たとえば、ディスプレイ上でランダムな名前をスクロールする方法は次のとおりです:

from microbit import *
import random

names = ["Mary", "Yolanda", "Damien", "Alia", "Kushal", "Mei Xiu", "Zoltan" ]

display.scroll(random.choice(names))

リスト (names)には、文字列として定義された7つの名前が含まれています。最後の行は 入れ子 になっています(先に紹介した「玉ねぎ」状のことです)。この random.choice メソッドは names リストを引数として取り、ランダムに選択された項目を返します。この項目(無作為に選ばれた名前)が display.scroll の引数になります。

自分の名前を含むようにリストを変更できますか?

乱数

乱数は非常に便利です。ゲームでは一般的に使われています。サイコロを使ったりするのも乱数を得るためですよ。

MicroPython には、いくつかの便利な乱数メソッドがあります。シンプルなサイコロを作る方法は次のとおりです:

from microbit import *
import random

display.show(str(random.randint(1, 6)))

デバイスがリセットされるたびに、1 から 6 までの数字が表示されます。入れ子 にも慣れてきたでしょうが、 random.randint は2つの引数の間の整数を返します。 display.show は文字の引数を期待しているので、 str 関数を使用して数値を文字に変換します(たとえば 6"6" に変換します)。

0 から N までの数字が欲しいこともあると思いますが、そのようなときには random.randrange メソッドを使います。このメソッドに単一の引数 N を与えると、0 から N 未満の乱数を整数で返します(これは "random.randint の振舞いと違っています)。

場合によっては小数点以下の数字が必要になることがあります。これは 浮動小数点数 と呼ばれ、そのような数値を random.random メソッドで生成できます。これは 0.0 から 1.0 の間の値を返すだけです。より大きなランダムな浮動小数点数が必要な場合は、以下のように random.randrangerandom.random の結果を加算するとよいです:

from microbit import *
import random

answer = random.randrange(100) + random.random()
display.scroll(str(answer))

混沌の種(Seeds of Chaos)

コンピュータで使われている乱数生成器は本当にランダムではありません。開始シード値を与えられた結果のようにランダム値を生成します。シード値の生成には、現在時刻やチップ内に内蔵されている温度計などのセンサー値のようなランダム性のあるものを使うこと多いです。

反復可能なランダム性、すなわち再現性のある乱数発生が欲しいこともあります。サイコロを投げるたびに同じ5つのランダムな値が必要であるようなことです。

これはシード値を設定することで簡単に実現できます。既知のシードが与えられると、乱数ジェネレータは同じ乱数セットを作成します。シードは random.seed に任意の整数を指定します。以下バージョンのサイコロプログラムは常に同じ結果を生成します:

from microbit import *
import random

random.seed(1337)
while True:
    if button_a.was_pressed():
        display.show(str(random.randint(1, 6)))

このプログラムが最初のサイコロの例のようにデバイスをリセットする代わりに、ボタン A を押すようにしているのはなぜでしょう?