2013-04-20 6 views
5

私は反復せずに数値をランダム化するプロジェクトを行っています。ここに私のコードはリピートしないLuaの数値をランダム化

for i = 1, 86000 do 
    while rndom[num] ~= nil do 
     num = math.random(1,95000) 
    end 
    rndom[num] = num 
    for k=1, 11 do 
     file2:write(input[num][k], " ") 
    end 
    file2:write("\n") 
end 

だ基本的には数が繰り返され、rndom [NUM]〜= nilをランダム化したときに、それが再び番号をランダム化しますので、[NUM] rndomに価値を置きます。私の問題は、私の「私」が高くなり、それが止まる時間が来るので、ロードに時間がかかり過ぎているということです。私はランダマイザーがrndom [num]を得ることができないのでそれが 'nil'であると推測しています。私は間違いないでしょうか?私はそれの実行時間を改善したいと思います。私の問題に対してより良い解決策を提案できる人は誰ですか?

ありがとうございます!

答えて

4

O(N)時間の複雑さで順列を生成する方が良いです。

local n = 95000 

local t = {} 
for i = 1, n do 
    t[i] = i 
end 

for i = 1, 86000 do 
    local j = math.random(i, n) 
    t[i], t[j] = t[j], t[i] 
    for k = 1, 11 do 
     file2:write(input[t[i]][k], " ") 
    end 
    file2:write"\n" 
end 
+0

うわー。それはそれでした!間違いなく実行時間を短縮しました。どうもありがとうございます。 – Rachelle

+3

math.random(i、n)を使用できます。 http://lua-users.org/wiki/RandomSampleを参照してください。 – lhf

+0

@lhf - ありがとう。 –

1

あなたが既に持っている変数を取得したときにもう一度randomを使用するのではなく、次に使用する変数を返そうとする単純な解決策があります。そうすれば、実行時間(最大)はO(N^2)になることが保証されます。

+0

oh。繰り返されるランダム化された番号の次の番号を意味しますか? – Rachelle

+0

正確に。だから、あなたがランダム5なら、それに印を付けてください。ランダム5をもう一度やり直した後、6が取られたら試してみてください。そうでない場合は、それを返します。あなたが最大に達したらラップすることを忘れないでください。 –

+0

申し訳ありません。私はそれを試してみます。ありがとう。 – Rachelle

関連する問題