2013-04-20 11 views
5

Lua'da tekrarlama olmaksızın rasgele sayıları içeren bir proje yapıyorum. İşteYineleme olmadan Lua'daki sayıları rastgele sayma

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 

Temel olarak rndom [num] için bir değer koyar benim kod böylece randomize sayı tekrarlar ve rndom [num] ~ = nil, tekrar numarayı rastgele zaman. Benim sorunum, 'i' yükseldikçe yüklenemeyecek kadar uzun sürüyor ve duracak bir zaman gelecek. Tahminimce çünkü randomizer 'nil' olan bir rndom [num] alamıyor. Demek istediğim, oranlar doğru mu? Onun çalışma süresini iyileştirmek istiyorum. Sorunuma daha iyi bir çözüm önerebilecek olan var mı?

Teşekkürler!

cevap

4

O(N) zaman karmaşıklığı ile bir permütasyon oluşturmak daha iyidir.

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

vay. Bu yaptı! Kesinlikle çalışma süresini daha hızlı yaptı. Çok teşekkür ederim. – Rachelle

+3

math.random (i, n) 'yi kullanabilirsiniz. Bkz. Http://lua-users.org/wiki/RandomSample. – lhf

+0

@lhf - Teşekkürler. –

1

Basit bir çözüm, zaten sahip olduğunuz bir değişkeni aldığınızda, bir sonraki kullanılabilir olanı döndürmeye çalışmak yerine random'u kullanmak yerine bir daha çözümdür. Bu şekilde O(N^2) çalışma süresine sahip olmanız garantidir (maksimum).

+0

oh. Tekrarlanan rasgele sayıya bir sonraki sayıyı mı kastediyorsunuz? – Rachelle

+0

Tam olarak. Yani, eğer rastgele 5, işaretle. Tekrar 5 rastgele geçtikten sonra 6 tane alınsa deneyin. Aksi takdirde, iade edin. Azami seviyeye ulaştıktan sonra sarılmayı unutma. –

+0

Tamam. Deneyeceğim. Teşekkürler. – Rachelle