アカウント名:
パスワード:
rand( )その1UNIX の /usr/ucb/cc、gcc、g++を解析した結果、 rand( ) は以下の動作をすることがわかった。static long x=1;void srand(unsigned s) { x=s; }long rand() { x=x*1103515245+12345; return x&2147483647; }これは、非常にシンプルな線形合同法である。この乱数の最下位ビットは0と1の繰り返しになる。すなわち、偶数と奇数が交互に生成される。このことから、この乱数で下位ビットを乱数として使うのは危険であることがわかる。また、ある乱数が得られたら、次に現れる乱数が1種類しかないという欠点も持つ。
ほとんどの応用では、下位ビットは重要な意味をもたず、m = wとしても満足できる。――ただし、乱数を使うプログラマが乱数を賢く使うことを前提としてである。
long hi, lo, x; /* Can't be initialized with 0, so use another value. */ if (*ctx == 0) *ctx = 123459876; hi = *ctx / 127773;
とりあえずVC++7.1付属のCRTでは、randの内部状態はスレッド毎に管理されているようですが。
Xbox360の開発環境ではどうなのかは知りませんが、似たような実装になっていればスレッドの使い方によってはこういう結果になるんじゃないでしょうか。
とりあえずVC++7.1付属のCRTでは、randの内部状態はスレッド毎に管理されているようですが。Xbox360の開発環境ではどうなのかは知りませんが、似たような実装になっていればスレッドの使い方によってはこういう結果になるんじゃないでしょうか。
13.16: ある範囲の整数からなる乱数はどうやったら生成することができるか。 A: すぐに思い付く、 rand() % N (これは0からN-1までの数を返そうとする)は乱数の質が低い。なぜなら乱数発生器の多くで下位のビットは悲惨なほどランダムでない(質 問13.18を参照のこと)。よりよい方法は以下のようなものである。 (int)((double)rand() / ((double)RAND_MAX + 1) * N) 浮動小数を使うことが気になるのなら、以下の方法を試せばよい。 rand() / (RAND_MAX / N + 1)
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
海軍に入るくらいなら海賊になった方がいい -- Steven Paul Jobs
理解できん (スコア:0)
何でこんなことになったの?
Re:理解できん (スコア:5, 参考になる)
だそうで、まさにこれが原因じゃないでしょうか。
Re:理解できん (スコア:2, 参考になる)
もしrand()が [0,1) のdoubleを返していたら、定番の「6を掛けて整数に切り捨て1を足す」というイディオムを使わざるを得ず、こういうバグは起きなかった。乱数を返す関数に小数を返す言語が多いのはこのあたりが理由ですかねえ。
ちなみに、ワードサイズ w (例えば2^31)の計算機における x[n+1] = ( a * x[n] + c) mod m の線形合同法について、Knuth翁は、m = w では最下位ビットは「定数になるか、確実に交代する」(やや不自然な訳)ので m = w±1 の方が望ましいが、 といわれております。
『The Art of Computer Programming Volume 2 Seminumerical Algorithms 日本語版』Donald E. Knuth著、有沢誠他監訳
Re:理解できん (スコア:1)
skiplistを試してみたとき、リストの深さを決定するのに、
while(rand()%2==1) {
level++;
}
みたいなことをしたんですが、深さは0が1しか得られませんでした。
おかげでskiplistなのに遅い遅い(笑)
NetBSD1.6のころだったっけ。
linuxでは一応期待したように動きましたが、rand()%2はアレなので止めました(笑)
何も考えず Mersenne Twister (スコア:1)
自分で C++ のクラス使ってたら、あっさりと boost::random [kmonos.net] に含まれていることに気づいた。boost のせい(おかげ)で自作のクラスライブラリの結構な部分が不要になってうれしいような悲しいような。まぁ自分で作った糞ライブラリよりも
えらい人が作ってえらい人がレビューしたライブラリの方が信頼性が高い(はずな)ので良し!とするか。
#えらい人が増えれば増えるほど、自分(と自分のやった仕事)が
#不要になっていくので人類の進歩は自分の存在価値と相反するのだと
#気づいた今日この頃。えらい人が糞な仕事で忙殺されないように
#雑用こなすのが使命と気づいた。それすら満足にこなせてないが orz
屍体メモ [windy.cx]
Re:理解できん (スコア:0)
最近のアルゴリズムでは、メルセンヌ・ツイスターがけっこう良かった気がする。
Re:理解できん (スコア:0)
Re:理解できん (スコア:0)
Re:理解できん (スコア:3, 興味深い)
まるまるパクってきた使ったのでは?
不具合情報を見ると、線形合同法の欠点がもろ出ているように思えますが。
Re:理解できん (スコア:0)
Re:理解できん (スコア:4, すばらしい洞察)
カードのシャッフルも最初に行ってるでしょうし。
対AI戦では、思考ルーチン内で乱数使ってるために、この問題は発生しないんでしょう。
Re:理解できん (スコア:0)
Re:理解できん (スコア:1)
とりあえずVC++7.1付属のCRTでは、randの内部状態はスレッド毎に管理されているようですが。
Xbox360の開発環境ではどうなのかは知りませんが、似たような実装になっていればスレッドの使い方によってはこういう結果になるんじゃないでしょうか。
Re:理解できん (スコア:4, 興味深い)
これは気をつけないとセキュリティホールとかの温床になるかもしれない。
Re:理解できん (スコア:2, すばらしい洞察)
そこまでテストプレイでやりこんでなかったのなら、他のバグも大量に潜んでるんじゃないかな?
Re:理解できん (スコア:3, 参考になる)
正に大量でして。
一例を挙げると、
・選んだものと違うカードが使用される(場合によってはその局面では使用できないはずのものまで)
・CPUが突然逆方向に進み始める
・フリーズする
・ありえない量の報酬が出現
など。ゲームバランス調整なんてレベルじゃなく、デバッグもせずα版をそのまま出荷したんじゃないかという疑念さえ漂う一品です。
チューニングで参加している猿楽庁がいったい何をやったのか、非常に気になります。
Re:理解できん (スコア:1)
もう手戻りできない段階のとき、よくあるじゃん。
… まさか俺だけじゃないよな。
Re:理解できん (スコア:1)
直接的な原因は「質の悪い擬似乱数を、悪い方法で使っている」ことかもしれませんが、
テストプレイで見つからない(あるいは認識してはいたが見逃す判断をした)方がより
根深い問題でしょう。
続編ということで、ゲームバランスの確認まできちんとやっていなかった、とか…?
Re:理解できん (スコア:2, 興味深い)
戦闘シーンがもう冗長で不便で。とりあえずカード名は最初だけ表示してすぐに消すのに
毎回戦闘時の能力値変化とか特殊能力を一行づつ表示しやがる
(「アレスの応援」「能力値変化」「ポセイドンの応援」「能力値変化」なんか一度で表示できるでしょうに)とか
「○○無効化」「無効化できなかった」(相手に○○ないんですけど)とか
ダメージを受けた際のエフェクトのあと一息置いてカード破壊のエフェクトするとか
素人丸出しの仕様がてんこもり。
さらに今回のバージョンは目標額が上がっているらしく。
CPUとやってるはずなのにストーリーの初期ですらかなり時間掛かる。
#いろいろ問題はあったが今考えたらアヴァロンの鍵はプレイ時間短縮のために相当工夫してたよなと。
まあそもそもボードゲームカードゲームのバランス修正をきちんとできる人は
あんまりいないじゃないかと思うけどね。コンピュータ上で実装して
適正なプレイ時間とかゲームをプレイして楽しいという域まで持っていくのなんか奇跡に近い。
+=======------
| K.Hamaura a.k.a. SeyfertSluw
| 「SFはどこまで実現するか」 復刊希望は→http://www.fukkan.com/vote.php3?no=4901
Re:理解できん (スコア:0)
Re:理解できん (スコア:0)
Re:理解できん (スコア:1)
>素人丸出しの仕様てんこもり
と書いたんだが。
たとえばWindowsだったら
「コントロールパネル→キーボード→表示間隔を最低」
「コントロールパネル→マウス→速度を最低」
の状態でデバッグ作業をすることに等しいわけ。
現実このゲームでも「設定画面が『BGM』と『ボイス』だけかよ!」と真っ先に突っ込まれてた。
しかもボイスをオンにすると(というかデフォルトなんだが)いまどきのコンピュータとしては考えられないぐらい処理オチ。
ゲームのユーザーインターフェースも一種のOSだぞっと。
+=======------
| K.Hamaura a.k.a. SeyfertSluw
| 「SFはどこまで実現するか」 復刊希望は→http://www.fukkan.com/vote.php3?no=4901
Re:理解できん (スコア:0)
ネットワークアップデートできるからいいや、見切りで出しちゃえ。
みたいな感覚で出荷するにはブランド価値を下げるリスクが大きい出来だと思うんですが。
このシリーズのためにゲーム機を渡り歩いてくれるコアなユーザが比較的多いと思うので、
延期してでも品質を上げて出荷した方が良かったのではないかと思います。
Re:理解できん (スコア:0)
しかもダウンロードしたパッチだけでGB単位。
Re:理解できん (スコア:0)
Re:理解できん (スコア:1)
rand() % N
とすると法則性がでてしまうので、
(rand() / M) % N
/* M は適当に大きな数字 */
とかを使った方がより乱数性がよくなるとか。
Re:理解できん (スコア:4, 参考になる)
Re:理解できん (スコア:0)
Re:理解できん (スコア:3, 参考になる)
○:M は適当に大きな素数
正確に理解&記憶しとこうね。素数かどうかで全然効果が違うから。
Re:理解できん (スコア:0)
(int)(((double)rand() / RAND_MAX) * N)
というのを見ました。
以来ずっと乱数生成にはこれを使ってます……いい加減random()辺りに乗り換えろと言われそうですが