2013-04-20 7 views
5

मैं लुआ में एक परियोजना कर रहा हूं जिसमें दोहराने के बिना यादृच्छिक संख्या शामिल है। यहाँ मेरी कोडलूआ में यादृच्छिक संख्याएं दोहराए बिना

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] के लिए एक मूल्य डालता है ताकि यादृच्छिक संख्या को दोहराता है और rndom [NUM] ~ = नहीं के बराबर है, यह संख्या फिर से randomize जाएगा। मेरी समस्या यह है कि लोड करने में बहुत समय लग रहा है क्योंकि मेरा 'मैं' अधिक हो जाता है और ऐसा समय आएगा जब यह रुक जाएगा। मैं इसका अनुमान लगा रहा हूं क्योंकि यादृच्छिकता को एक रैंडम [num] नहीं मिल सकता है जो 'शून्य' है। मेरा मतलब है, क्या बाधाएं सही हैं? मैं इसके चलने का समय सुधारना चाहता हूं। कोई भी जो मेरी समस्या का बेहतर समाधान सुझा सकता है?

धन्यवाद!

उत्तर

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

@ एलएचएफ - धन्यवाद। –

1

एक आसान समाधान random का उपयोग करने के बजाय फिर से होता है जब आप पहले से मौजूद एक चर प्राप्त करते हैं, तो आप अगले एक को वापस लौटने की कोशिश कर रहे हैं। इस तरह आपको O(N^2) चलने का समय (अधिकतम) होने की गारंटी है।

+0

ओह। आपका मतलब यादृच्छिक संख्या के लिए अगला नंबर दोहराता है? – Rachelle

+0

बिल्कुल। तो, यदि आप यादृच्छिक 5, इसे चिह्नित करें। यादृच्छिक 5 फिर से याद करने के बाद, 6 को लिया गया था या नहीं। यदि नहीं, तो इसे वापस करें। अधिकतम पहुंचने के बाद बस लपेटना याद रखें। –

+0

ठीक है। मैं इसे आजमाऊंगा। धन्यवाद। – Rachelle

संबंधित मुद्दे