PHP と C でアプリケーションを開発していますがrand
、同じシードを使用しているにもかかわらず、2 つの言語で結果が異なります。
PHP:
srand(1);
$random = rand(); // returns 32422
子:
srand(1);
int random = rand(); // returns 41
なぜこうなった?
疑似乱数ジェネレーターを実装する方法は複数あります。
すべてのプログラミング言語は、独自のrand
実装を自由に指定することも、何も指定しないこともできます。たとえば、C の仕様では、「このrand
関数は 0 ~ の範囲の疑似乱数の整数のシーケンスを計算する」とだけ述べられていRAND_MAX
ます。どのようrand
に動作するかについては言及されていないため、コンパイラの作成者はrand
好きなように実装できます。
多くのコンパイラは、線形合同ジェネレータを使用して を実装しrand
ます。この単純なアルゴリズムにも、コンパイラが自由に指定できるパラメーターがあり、特定のシードによって与えられる数値のシーケンスを変更します。
Borland と glibc が異なるパラメーターを使用する方法を見てください。rand
一般的なすべてのプログラムは言うまでもなく、すべての C プログラムで同じように動作することさえ信頼できません!