2013-04-20 10 views
5

Ich mache ein Projekt in Lua, die randomizing Zahlen ohne Wiederholungen beinhaltet. Hier ist mein CodeRandomize Zahlen in Lua ohne Wiederholungen

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 

Im Grunde ist es ein Wert an die rndom setzt [num], so dass, wenn randomisierte Zahl wiederholt und rndom [num] ~ = nil, wird es Zahl wieder randomisieren. Mein Problem ist, dass es zu lange dauert, um es zu laden, da mein "Ich" höher wird und es wird eine Zeit kommen, in der es aufhört. Ich schätze, es ist, weil der Randomizer kein rndom [num] bekommen kann, das 'nil' ist. Ich meine, was sind die Chancen richtig? Ich möchte die Laufzeit verbessern. Jeder, der eine bessere Lösung für mein Problem vorschlagen kann?

Danke!

Antwort

4

Es ist besser, eine Permutation mit O(N) Zeitkomplexität zu generieren.

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

wow. das hat es getan! Es hat definitiv die Laufzeit schneller gemacht. Ich danke dir sehr. – Rachelle

+3

Sie können math.random (i, n) verwenden. Siehe http://lua-users.org/wiki/RandomSample. – lhf

+0

@lhf - Danke. –

1

Eine einfache Lösung ist, anstatt random erneut zu verwenden, wenn Sie eine Variable erhalten, die Sie bereits haben und versuchen, die nächste verfügbare Variable zurückzugeben. Auf diese Weise haben Sie garantiert O(N^2) Laufzeit (maximal).

+0

oh. Du meinst die nächste Zahl zu der Zufallszahl, die sich wiederholt? – Rachelle

+0

Genau. Also, wenn Sie zufällig 5, markieren Sie es. Versuchen Sie nach dem Zufallsprinzip 5 erneut, ob 6 vergeben wurde. Wenn nicht, gib es zurück. Denken Sie daran, sich zu wickeln, wenn Sie das Maximum erreicht haben. –

+0

In Ordnung. Ich werde es versuchen. Vielen Dank. – Rachelle