今日、私はルアで簡単なゲームを書いていました。このゲームの一部は、テーブルからランダムな要素を選択して印刷する必要があります。例:Lua math.randomは壊れていますか?
test = { "foo", "bar", "test"}
print(math.random(#test))
事は次のようなものです。 もし私が何かが恋しくなるなら、それはなぜREPLでうまくいくのですか?
ご了承ください。悪い英語をおねがいします。
今日、私はルアで簡単なゲームを書いていました。このゲームの一部は、テーブルからランダムな要素を選択して印刷する必要があります。例:Lua math.randomは壊れていますか?
test = { "foo", "bar", "test"}
print(math.random(#test))
事は次のようなものです。 もし私が何かが恋しくなるなら、それはなぜREPLでうまくいくのですか?
ご了承ください。悪い英語をおねがいします。
乱数ジェネレータをシードする必要があります。
ルアのmath.random()
機能は、Cのrand()
機能に対応します。
rand()
関数は、最初のシードによって決まるシーケンスの次の値を返します。デフォルトの初期シード値は1
です。これは、プログラムが実行されるたびに同じシーケンスを使用することを意味します(再現性のある結果が必要な場合に便利です)。
ランダムに近い結果を得るには、現在の時間などを使用してシードを初期化する必要があります。 Cにおいて
、これは次のように行うことができる。
srand(time(NULL));
int r = rand();
対応Luaのコードは次のとおりos.time()
は、典型的にはそう秒の整数として、現在の時刻を返すこと
math.randomseed(os.time())
print(math.random())
注同じ秒でプログラムを2回実行すると、同じシードが得られます。また、Cのrand()
関数、したがってLuaのmath.rand()
関数は、高品質の擬似乱数ジェネレータではありません。 を使用しないでください。は、暗号化のようなアプリケーションには、予測不可能な値を必要とする用途のいずれかを使用します。 (より良いPRNGがありますが、この質問の範囲を超えています)
BSDとMac OSXのちょうど1つのことは、2つのシードがちょっと違うと、random()の結果が同じになるという問題です。これを回避するには、math.randomseed(tonumber(tostring(os.time()):reverse():sub(1,6)))(ソース:http://lua-users.org/wiki/MathLibraryTutorial) –
私はreplで動作しません。 –
また、 '#test'は値そのものではなくインデックスを出力します。 –
random()関数をすべての言語で使用していない場合、ほとんどの言語で使用する場合、プログラムの実行ごとに異なる結果を得るには、シード値を使用する必要があります。 math.random()を呼び出す前に、math.randomseed(os.time())のようなものを使うべきです。 –