2016-12-26 5 views
0

今日、私はルアで簡単なゲームを書いていました。このゲームの一部は、テーブルからランダムな要素を選択して印刷する必要があります。例:Lua math.randomは壊れていますか?

test = { "foo", "bar", "test"} 
print(math.random(#test)) 

事は次のようなものです。 もし私が何かが恋しくなるなら、それはなぜREPLでうまくいくのですか?

Screenshot of the code and CMD It works in REPL イム・バージョン5.3.2を使用しています。

ご了承ください。悪い英語をおねがいします。

+0

私はreplで動作しません。 –

+0

また、 '#test'は値そのものではなくインデックスを出力します。 –

+2

random()関数をすべての言語で使用していない場合、ほとんどの言語で使用する場合、プログラムの実行ごとに異なる結果を得るには、シード値を使用する必要があります。 math.random()を呼び出す前に、math.randomseed(os.time())のようなものを使うべきです。 –

答えて

3

乱数ジェネレータをシードする必要があります。

ルアの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がありますが、この質問の範囲を超えています)

+0

BSDとMac OSXのちょうど1つのことは、2つのシードがちょっと違うと、random()の結果が同じになるという問題です。これを回避するには、math.randomseed(tonumber(tostring(os.time()):reverse():sub(1,6)))(ソース:http://lua-users.org/wiki/MathLibraryTutorial) –

関連する問題