frei

旧「anney's room」からブログ「frei」だけ引っ越し&残しました

安定したランダムって。

これまた初歩的なところで、勘違いしてたのでメモ。

perl のハッシュのキーの並びはランダムだと思ってたので

keys %hash すると、出てくる値はコロコロ変わるのを期待してたら

実は同じ並びで出てきている模様。

例えば、キーが 1 2 3 a b c であった場合、出てくる順は c 1 a b 3 2 で

明らかにABC順ではないものの、何度繰り返しても c 1 a b 3 2 なんだな、これが。

実行環境に依存すんのかと思って、coLinux上と cygwin 上と

外部のサーバー上で実行しても同じ結果。

かくして、確実に毎回ランダムで値を出すには、別の方法が必要っぽそうなんだなぁ…と思いつつ

ググったらちゃんと書いてあった

これまで keys(), values(), each() が返すハッシュ要素の順序は本来ランダムでしたが繰り返しても安定でした

おぉ、「繰り返しても安定でした」って、この事か。

ハッシュの順序の無作為化を許す新しい機能を Perl に追加しました. この機能を有効化するためには環境変数 PERL HASH_SEED に特定の値を設定します

てな訳で、この「安定」とやらを解除するのに

$ENV{'PERL_HASH_SEED'} = 0; を書いてから実行すりゃいいのかと思って、

何度か実験したんだけど、どうも変わらない。

PERL_HASH_SEED=0;export PERL_HASH_SEED もやったけどダメ。

うーむ。perlコンパイル時に -DUSE_HASH_SEED_EXPLICIT をつけないとアカンのやろか。

ちなみに、coLinuxDebian)上のperlは、5.8.4 cygwinperlは、5.8.2 で

ちゃんと PERL_HASH_SEED の設定が効くはずなんだけどねぇ…。