Processing Ver.2のrandom関数のバグ

プログラミング

一般にソフトウェアの開発においては、
単体テスト
結合テスト
総合テスト
など、各開発段階においてバグを取り除くためにかなりの時間を割きます。
製品レベルのソフトウェア、例えば、銀行のシステムなどでバグが残っていて、それが運用段階で発覚し、システムがストップなどしたら社会が混乱し大問題です。

今回はプログラミング教室用に開発したプログラムが、何回もの授業で問題なかったのに、いきなりある授業のときにエラーとなった例をご紹介しましょう。

使用していたのはProcessingのVer.2.2.1です。
Processingのrandom関数は
random(a, b)
のように記述しますが、得られる乱数はa以上b未満です。
未満なのでbになることはないはずです。
従って
int(random(a, b))
のように切り捨てして整数にすれば
整数bが得られることはありません。
最大でもb-1です。

このことを検証するプログラムが以下です。

このプログラムでは
r == n
となることはないはずです。
ところが、実行してみると、約1677万回繰り返したところで、r == n
となりました。何回も繰り返し計算すると、このようなことがごく稀に起こるようです。
実際のプログラムでは使用する配列の要素数が足りなくなりエラーとなっていたわけです。
それ以来、 r >= n になったときは r = n-1 とするようにプログラムを変更しました。

幸いなことに、ProcessingのVer.3では繰り返しテストしてもエラーにはならないようで、バグフィックスされているものと思われます。