You are here: Home / TinBlog / 乱数が乱数でなくなる・・・こともある

乱数が乱数でなくなる・・・こともある

Posted by h2 at Feb 24, 2011 10:10 PM |
Filed under:
仕事上のネタだが、あまりに衝撃だったので書く。

とあるプログラムで、「日替わりでランダム」を実現するのに、お手軽にrand()で済ませたことがある。

かれこれ6ヶ月以上前のことだ。内容は、大まかに

  srand(日付);
  value = rand() % (日替わりアイテム総数);

 こんな感じで。こうしておくと、この部分の計算ルーチンが何度走っても(つまりアプリケーションを再起動しても)、その日の間は同じvalueになる。

当然、動作確認もした。

日替わりアイテム総数も、暫定で2回、本仕様向けに1回変更されたが、すべて、まるっきり問題なく動いていた。

 

それが。

もうすぐ完成という週の、ドン詰まりのぎりぎりで。

「日替わりアイテムの総数を変えたい」と。

 

まあ、クライアントさんのご希望だし、そのぐらいはね。

ということで、変更した。「7」に。

すると、それまで問題なく動いていた日替わり内容が、いきなり変化しなくなってしまったのだ。

 

当然、びっくりしましたよ。 顔が青くなりましたよ。

慌てて確認しましたよ。あちこち。

 

そして、やがて判明した、大笑いな現実が。

srand(1) ==> rand() % 7 ==> 16807 % 7 = 0
srand(2) ==> rand() % 7 ==> 33614 % 7 = 0
srand(3) ==> rand() % 7 ==> 50421 % 7 = 0
srand(4) ==> rand() % 7 ==> 67228 % 7 = 0
srand(5) ==> rand() % 7 ==> 84035 % 7 = 0
.... (中略).... 
srand(27) ==> rand() % 7 ==> 453789 % 7 = 0
srand(28) ==> rand() % 7 ==> 470596 % 7 = 0
srand(29) ==> rand() % 7 ==> 487403 % 7 = 0
srand(30) ==> rand() % 7 ==> 504210 % 7 = 0

 ・・・・・・・・・・・・。

 

って、ちょっと待てオイ。

まさか、こーゆーオチだとは思わなくて、はじめはアイテム入れ替え時の作業ミスを調べまくったのだ。

 

・・・にしても、だ。

いったいどうすれば、予定していた動作範囲内の乱数全ての公約数を取ってこられるんだろうか。

しかも、マスターアップ直前の、終業時間寸前に、仕様変更を滑り込ませるなんて。

なんたる神業

 

まあ、原因がわかれば、対策なんてすぐ立てられたわけだけど。

・・・もちろん残業ですがな (;o;

 

 

Filed under:
« August 2019 »
August
SuMoTuWeThFrSa
123
45678910
11121314151617
18192021222324
25262728293031