1. ホーム
  2. random

[解決済み] Luaで一様乱数を生成する

2022-03-10 07:57:44

質問

Luaでマルコフ連鎖のプログラミングをしているのですが、その中の一つの要素として、乱数を一様に発生させることが必要です。以下は私の質問を説明するための単純化された例です。

example = function(x)
    local r = math.random(1,10)
    print(r)
    return x[r]
end

exampleArray = {"a","b","c","d","e","f","g","h","i","j"}

print(example(exampleArray))

私の問題は、このプログラムを複数回再実行すると(mash F5 ) 全く同じ乱数が生成され、サンプル関数が全く同じ配列要素を選択します。しかし、1つのプログラムの中で、最後のprint行を何度も繰り返してサンプル関数を何度も呼び出すと、適切な乱数結果が得られます。

適切なマルコフ擬似乱文生成器は、同じプログラムを同じ入力で複数回実行し、毎回異なる擬似乱文が出力できるはずなので、これは私の意図するところではありません。種をリセットするために math.randomseed(os.time()) となり、乱数分布が一様でなくなってしまいます。私の目標は、上記のプログラムを再実行し、毎回ランダムに選択された数字を受け取ることができるようにすることです。

どのように解決するのですか?

を実行する必要があります。 math.randomseed() 一旦 を使用する前に math.random() を、このように。

math.randomseed(os.time())

ご覧になったコメントでは、最初の数字がそのままになっていますね。これは、一部のプラットフォームにおけるランダム・ジェネレーターの実装に起因するものです。

解決策としては、実際に使用する前に、いくつかの乱数をポップすることです。

math.randomseed(os.time())
math.random(); math.random(); math.random()

なお、標準Cライブラリ random() より良い解決策は、もしあなたのプラットフォームがより良いランダムジェネレータを提供しているならば、それを使うことです。

参考にしてください。 Lua Math ライブラリ