11

PRNG が使用するものよりも Mersenne Twister を使用するため、mt_rand()overを使用することが推奨されていることは知っていますが、考慮されていないように見えるものがあります: ユーザー アクティビティです。rand()rand()

実際、ユーザーの行動はかなりランダムであると見なすことができます。たとえば、任意の時点で、ユーザーが 1 つの機能の呼び出しをトリガーする可能性が 4%、ユーザーが3 つの呼び出しと をrand()トリガーする可能性が 8%、ユーザーの 20% が 2 つの呼び出しをトリガーする可能性があります。ユーザーがページを読み込むと、PRNG が 1 つ進みます。rand()shuffle()rand()

結局のところ、NPC の動きが、ポケモン ゲームでの RNG の悪用を非常に苛立たせているのではないでしょうか?

それで、 にrand()はパターンがありますが、ユーザーのアクティビティのランダム性との欠点を無関係rand()にするのに十分な用途の多様性があることを心に留めておいてください。rand()絶対的に言えば、mt_rand()「よりランダム」です。しかし、これは人間の要素のエントロピーと比べてどうだろうか?

4

2 に答える 2

4

rand() の呼び出しが人間のユーザーによってランダムに生成されると仮定すると、あなたのロジックは正しいと思います。

ただし、X 秒ごとに同じ要求を送信するボット (人間の呼び出しによって中断されない夜間) や、一定時間実行され、rand() を 1 つずつ実行する単純なスクリプトを想像してみてください。その場合、ランダム性に完全に依存することはできません。

php.net からのコメント:

自動シード処理は現在の秒数で行われるように見えることに注意してください。これは、高速サーバーで複数回実行しても同じ結果が得られることを意味します。より頻繁に変更されるシードを使用して srand() を自分で呼び出すか、問題が発生していないように見える mt_rand() を使用してください。

于 2013-01-09T21:33:55.300 に答える
0

しかし、これは人間の要素のエントロピーとどのように比較されますか?

私はこのシナリオを想像します:

  • 数千人のユーザーがいるゲーム。
  • 何らかの理由で、X分ごとに、ユーザーごとにランダムな値を設定する必要があります(毎回同じ順序で指定されます)

疑似ランダム関数のため、ユーザーXXXとユーザーYYYの距離は常に同じである可能性が高くなります。疑似ランダムの問題の1つは、十分な数のサイクルの後、領域が「より」予測可能になる可能性があることです。

于 2013-01-09T21:49:23.280 に答える