誰も悲しまないランダムの嘘

モンスターブラックマーケットには「母乳」というアイテムがあります。奴隷から搾乳することで得られ、奴隷に与えると能力が上がります。今回はこの母乳の挙動から、誰も悲しまないランダムの嘘の話をしましょう。

母乳を奴隷に与えると、15%の確率で母乳の種類に応じて2~6種類の能力のうち1つが上がります。たとえばドワーフ母乳は15%の確率で受胎率+5%または最大出産回数+3の効果を発揮します。外れると何も起こりません。

母乳は大量に作れて、その気になれば数百どころか数千、数万個でも作れます。そして個数を指定して一気に使用できます。ここまでの説明で、プログラミングの経験のある方は何をしたら不味いことになるかわかったのではないでしょうか。

はい。一気に使うのが数個程度なら問題ありませんが、個数が増えると処理時間も延び、その間フリーズします。数千個でプチフリーズしたので試しに数万個集めてぶち込んでみたらそこそこ長時間フリーズしました。

内部で何が起こっているのでしょう。開発陣ではないので妄想ですが
繰り返し(個数){
 条件(ランダム(15%)){
  条件(ランダム(50%)){
   受胎率 = 受胎率 + 5
  }違う場合{
   最大出産回数 = 最大出産回数 + 3
  }
 }
}
のように真面目に母乳の処理を個数分繰り返しているのではないでしょうか。個数に応じて処理時間も延びたので。このプログラムは全く正しいプログラムです。言われたことをそのままプログラムにしており、テストをスムーズに通過するでしょう。そして個数に応じて処理時間が延びてフリーズしました。ちょっとアレですね。

ところで私は「ランダムなんてバレなきゃランダムじゃなくてもいいじゃん」という邪悪な思想を持っています。どういうことかというと、次のようなプログラムです。
条件(個数 <= 100){
 繰り返し(個数){
  母乳処理
 }
}違う場合{
 繰り返し(100){
  母乳処理
 }
 受胎率 = 受胎率 + (個数 - 100)個のドワーフ母乳の期待値
 最大出産回数 = 最大出産回数 + (個数 - 100)個のドワーフ母乳の期待値
}
こちらのプログラムは100個までは真面目に母乳処理を繰り返しますが、それを超えた部分は期待値をそのままポンと足して適当に誤魔化しています。

真面目に1000回繰り返さないので正確なランダムではありませんが、一応結果は毎回変動してランダムっぽく、それでいてランダム処理は最大200回までしか増えません。このため個数が増えてもほぼフリーズしないはずです。

さて、このプログラムが私の思っているとおりに動いたとして。私はランダムでないものをランダムだと嘘を吐いたわけですが、誰か困るでしょうか。多分誰も困りません。同人エロゲなので。お金の絡むソシャゲではありませんし、学術的な何かや巨額の資産を動かすようなシステムでもありません。何百回も同じ条件で試行してデータを取って検証するようなプレイヤーは多分いませんからバレもしません。普通に毎回結果がブレる挙動に満足して、フリーズに悩まされることもないまま素通りしてくれると思います。誰も悲しまないランダムの嘘。

ランダムはその性質上、正しく機能しているかわかりづらいです。わかりづらいので、ちょっとした嘘を差し込める余地があります。ゲーム性のない作品には使えませんし、あっても毎回使えるというほどのものでもありますが、ひとつの案としてご検討ください。