2

さまざまなユーザー アプリケーションで使用できるライブラリを C で開発しています。

ライブラリは完全に「透過的」である必要があります。ユーザー アプリケーションはそれを初期化してファイナライズすることができ、実行中のアプリケーションに変更が加えられることは想定されていません。

問題は、ライブラリの初期化で C srand()/rand() 関数を使用していることです。これは、ライブラリユーザーのアプリケーションに影響を与えることを意味します。ユーザーが乱数を生成すると、rand() という事実の影響を受けます。すでに呼ばれていました。

では、 C の rand() 乱数ジェネレーターに代わる単純な非 GPLの代替案を誰か指摘できますか?

それは本当に強い必要はありません-私は数字で暗号化を行っていません. 私はいくつかの小さくて本当に単純なジェネレーター (時間をかけて何かと XOR し、素数と bla bla bla で何かをするようなもの) を書くことを考えていましたが、誰かがより適切なジェネレーターへのポインターを持っているかどうか疑問に思っていました。

4

2 に答える 2

3

ある状態を保持し、関数を呼び出すたびに状態を変更することで、次の番号を生成します。このような関数は疑似乱数ジェネレータと呼ばれます。PRNG を作成する古い方法は、線形合同ジェネレーターです。これは非常に簡単です。

static int rand_state;
int rand(void)
{
    rand_state = (rand_state * 1103515245 + 12345) & 0x7fffffff;
    return rand_state;
}

ご覧のとおり、この方法を使用すると、前の数字がわかっている場合にシリーズの次の数字を予測できます。もっと洗練された方法があります。

さまざまなタイプの疑似乱数ジェネレーターが、特定の目的のために設計されています。遅いがどのように動作するかを知っていても予測するのが難しい安全な PRNG があり、Mersenne Twister のような優れた分散特性を持ち、モンテカルロ シミュレーションを書くのに役立つ大きな PRNG があります。

経験則として、線形合同ジェネレーターはゲーム (モンスターがどれだけのダメージを与えるか) を書くには十分ですが、シミュレーションを書くには十分ではありません。プログラムに貧弱な PRNG を選択した研究者の輝かしい歴史があります。その結果、シミュレーションの結果は疑わしいものになります。

于 2012-10-15T14:43:13.120 に答える
0

C++ も受け入れられる場合は、Boost をご覧ください。

http://www.boost.org/doc/libs/1_51_0/doc/html/boost_random/reference.html

1 つのジェネレーターだけでなく、数十のジェネレーターを提供し、速度、メモリ要件、およびランダム性の品質の概要を示します。

于 2012-10-15T14:51:27.857 に答える