लुआ में, आमतौर पर math.random
& math.randomseed
का उपयोग करके यादृच्छिक मान, और/या स्ट्रिंग उत्पन्न होता है, जहां math.randomseed
के लिए उपयोग किया जाता है।(सुरक्षित) यादृच्छिक स्ट्रिंग?
हालांकि इस विधि में एक बड़ी कमजोरी है; लौटाया गया नंबर हमेशा वर्तमान समय के रूप में यादृच्छिक है, और प्रत्येक यादृच्छिक संख्या के लिए अंतराल एक सेकंड है, जो बहुत कम समय में कई यादृच्छिक मानों की आवश्यकता होने पर बहुत लंबा है।
यह समस्या लुआ उपयोगकर्ता विकी द्वारा भी इंगित की गई है: http://lua-users.org/wiki/MathLibraryTutorial, और इसी RandomStringS रसीद: http://lua-users.org/wiki/RandomStrings।
तो मैं बैठ गए हैं और एक अलग एल्गोरिथ्म लिखा था (अगर यह भी है कि कहा जा सकता है), कि (अ-) द्वारा यादृच्छिक संख्या उत्पन्न करता तालिकाओं की स्मृति पतों का उपयोग कर:
math.randomseed(os.time())
function realrandom(maxlen)
local tbl = {}
local num = tonumber(string.sub(tostring(tbl), 8))
if maxlen ~= nil then
num = num % maxlen
end
return num
end
function string.random(length,pattern)
local length = length or 11
local pattern = pattern or '%a%d'
local rand = ""
local allchars = ""
for loop=0, 255 do
allchars = allchars .. string.char(loop)
end
local str=string.gsub(allchars, '[^'..pattern..']','')
while string.len(rand) ~= length do
local randidx = realrandom(string.len(str))
local randbyte = string.byte(str, randidx)
rand = rand .. string.char(randbyte)
end
return rand
end
सबसे पहले , सब कुछ पूरी तरह से यादृच्छिक लगता है, और मुझे यकीन है कि वे ... वर्तमान कार्यक्रम के लिए कम से कम हैं।
तो मेरा सवाल यह है कि realrandom
वास्तव में ये संख्या कितनी यादृच्छिक है?
या कोई और भी बेहतर तरीका, एक सेकंड (जो एक तरह से संकेत मिलता है कि os.time
, नहीं किया जाना चाहिए, जैसा कि ऊपर explaind) की तुलना में छोटे अंतराल में यादृच्छिक संख्या उत्पन्न करने के लिए, और बाहरी पुस्तकालयों पर निर्भर रहे बिना है, यदि संभव हो, तो पूरी तरह से क्रॉसप्लेटफार्म तरीके से?
संपादित करें:
आरएनजी बीज के तरीके के बारे में एक बड़ी गलतफहमी प्रतीत होती है; उत्पादन कोड में, math.randomseed()
पर कॉल केवल एक बार होता है, यह यहां एक बुरी तरह से चुना गया उदाहरण था।
क्या मैं मतलब यादृच्छिक मान केवल यादृच्छिक एक बार प्रति सेकंड, आसानी से इस पेस्ट द्वारा प्रदर्शन किया जाता है: http://codepad.org/4cDsTpcD
इस सवाल भले ही मेरे संपादन downvoted हो जाएगा के रूप में, मैं भी रद्द कर दिया मेरी पहले स्वीकार किए गए उत्तर - एक बेहतर के लिए आशा में, भले ही बेहतर विचार हो। मैं समझता हूं कि यादृच्छिक मूल्यों/संख्याओं के बारे में मुद्दों पर कई बार चर्चा की गई है, लेकिन मुझे ऐसा कोई सवाल नहीं मिला है जो लुआ से प्रासंगिक हो सकता है - कृपया इसे ध्यान में रखें!
Knuth द्वारा उद्धरण तुरंत मेरे दिमाग में आया ... "यादृच्छिक संख्या यादृच्छिक रूप से चुनी गई विधि के साथ उत्पन्न नहीं की जानी चाहिए"। – Mormegil
ध्यान दें कि यह मानक लुआ नामस्थानों को विस्तारित या बदलने के लिए आम तौर पर एक खराब शैली है। 'String.random' का प्रयोग न करें, अपना खुद का मॉड्यूल लिखें। –
'string.random (20,' abcd ')' के लिए आपको क्या मिलता है? – aaz