मैं सेट से बेतरतीब ढंग से उठाए गए पात्रों से बना एक 5 चरित्र स्ट्रिंग चाहता हूं [a-zA-Z0-9]
।
जावास्क्रिप्ट के साथ ऐसा करने का सबसे अच्छा तरीका क्या है?
Math.random().toString(36).replace(/[^a-z]+/g, '').substr(0, 5);
मैं सेट से बेतरतीब ढंग से उठाए गए पात्रों से बना एक 5 चरित्र स्ट्रिंग चाहता हूं [a-zA-Z0-9]
।
जावास्क्रिप्ट के साथ ऐसा करने का सबसे अच्छा तरीका क्या है?
Math.random().toString(36).replace(/[^a-z]+/g, '').substr(0, 5);
जवाबों:
मुझे लगता है कि यह आपके लिए काम करेगा:
function makeid(length) {
var result = '';
var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
var charactersLength = characters.length;
for ( var i = 0; i < length; i++ ) {
result += characters.charAt(Math.floor(Math.random() * charactersLength));
}
return result;
}
console.log(makeid(5));
+=
इस तरह के स्ट्रिंग्स का उपयोग करने से इसका O (n ^ 2) व्यवहार होता है। यदि आप लंबे समय तक तार बनाना चाहते हैं, तो आपको व्यक्तिगत पात्रों की एक सरणी बनानी चाहिए और अंत में उन्हें एक साथ जोड़ना चाहिए।
+=
अक्सर किसी कारण के लिए तेज होता है, यहां तक कि छोरों के अंदर भी इस्तेमाल किया जाता है - jsperf.com/join-vs-concatenation
crypto
इसके बजाय उपयोग करें ।
let r = Math.random().toString(36).substring(7);
console.log("random", r);
नोट: उपरोक्त एल्गोरिथ्म में निम्नलिखित कमजोरियां हैं:
Math.random()
कार्यान्वयन के आधार पर अनुमानित ("यादृच्छिक-दिखने वाला" लेकिन वास्तव में यादृच्छिक नहीं) उत्पादन हो सकता है। परिणामस्वरूप स्ट्रिंग उपयुक्त नहीं है जब आपको विशिष्टता या अप्रत्याशितता की गारंटी देने की आवश्यकता होती है।Math.random().toString(36).substr(2, 5)
, क्योंकि .substring(7)
यह 5 वर्णों से अधिक लंबा होता है। पूर्ण अंक, अभी भी!
toString
जावास्क्रिप्ट में एक संख्या प्रकार की विधि संख्या को दिए गए आधार में बदलने के लिए एक वैकल्पिक पैरामीटर लेती है। उदाहरण के लिए, यदि आप दो पास करते हैं, तो आप अपना नंबर बाइनरी में दर्शाएंगे। हेक्स (बेस 16) के समान, बेस 36 अंकों का उपयोग करता है, अंकों को 9. से परे का प्रतिनिधित्व करने के लिए। एक यादृच्छिक संख्या को आधार 36 में परिवर्तित करके, आप प्रतीत होता है यादृच्छिक अक्षरों और संख्याओं के एक समूह के साथ हवा करेंगे।
(Math.random() + 1).toString(36).substring(7);
इस तरह की चीज के लिए गणित.ऑर्गन खराब है
विकल्प 1
यदि आप इस सर्वर को करने में सक्षम हैं , तो क्रिप्टो मॉड्यूल का उपयोग करें -
var crypto = require("crypto");
var id = crypto.randomBytes(20).toString('hex');
// "bb5dc8842ca31d4603d6aa11448d1654"
परिणामस्वरूप स्ट्रिंग आपके द्वारा उत्पन्न यादृच्छिक बाइट्स से दो बार होगी; प्रत्येक बाइट hex को एन्कोडेड 2 वर्ण है। 20 बाइट्स हेक्स के 40 अक्षर होंगे।
विकल्प 2
अगर आपको इस क्लाइंट को करना है , तो शायद uid मॉड्यूल आज़माएं -
var uuid = require("uuid");
var id = uuid.v4();
// "110ec58a-a0f2-4ac4-8393-c866d813b8d1"
विकल्प 3
यदि आपको यह क्लाइंट- साइड करना है और आपको पुराने ब्राउज़र का समर्थन नहीं करना है, तो आप इसे बिना निर्भरता के कर सकते हैं -
// dec2hex :: Integer -> String
// i.e. 0-255 -> '00'-'ff'
function dec2hex (dec) {
return ('0' + dec.toString(16)).substr(-2)
}
// generateId :: Integer -> String
function generateId (len) {
var arr = new Uint8Array((len || 40) / 2)
window.crypto.getRandomValues(arr)
return Array.from(arr, dec2hex).join('')
}
console.log(generateId())
// "82defcf324571e70b0521d79cce2bf3fffccd69"
console.log(generateId(20))
// "c1a050a4cd1556948d41"
अधिक जानकारी के लिए crypto.getRandomValues
-
crypto.getRandomValues()
विधि आप को क्रिप्टोग्राफी मजबूत यादृच्छिक मान प्राप्त करने देता है। पैरामीटर के रूप में दिया गया सरणी यादृच्छिक संख्या (इसके क्रिप्टोग्राफिक अर्थ में यादृच्छिक) से भरा है।
यहाँ थोड़ा सांत्वना उदाहरण दिया गया है -
> var arr = new Uint8Array(4) # make array of 4 bytes (values 0-255)
> arr
Uint8Array(4) [ 0, 0, 0, 0 ]
> window.crypto
Crypto { subtle: SubtleCrypto }
> window.crypto.getRandomValues()
TypeError: Crypto.getRandomValues requires at least 1 argument, but only 0 were passed
> window.crypto.getRandomValues(arr)
Uint8Array(4) [ 235, 229, 94, 228 ]
IE11 समर्थन के लिए आप उपयोग कर सकते हैं -
(window.crypto || window.msCrypto).getRandomValues(arr)
ब्राउज़र कवरेज के लिए https://caniuse.com/#feat=getrandomvalues देखें
.map()
विकल्प 3. Array.from(arr, dec2hex).join('')
=== में कोई आवश्यकता नहीं है Array.from(arr).map(dec2hex).join('')
। मुझे इन विशेषताओं से
require
मॉड्यूल केवल सर्वर-साइड का उपयोग करने में सक्षम नहीं है ?
शीर्ष 5 यादृच्छिक वर्णों की वापसी होती है, जैसा कि यहां पर दिए गए कुछ शीर्ष रेटेड उत्तरों के विपरीत है।
Math.random().toString(36).substr(2, 5);
Math.random().toString(36)
5 से कम वर्णों वाली संख्या वापस आती है तो क्या होगा ?
function getRandomString() { var result = ''; while (!result) result = Math.random().toString(36).substring(2); return result; };
यहां डबलटैप के उत्कृष्ट उत्तर पर सुधार किया गया है । मूल में दो कमियां हैं जिन्हें यहां संबोधित किया गया है:
सबसे पहले, जैसा कि दूसरों ने उल्लेख किया है, इसमें छोटी तारों या यहां तक कि एक खाली स्ट्रिंग (यदि यादृच्छिक संख्या 0 है) का उत्पादन करने की एक छोटी संभावना है, जो आपके आवेदन को तोड़ सकती है। यहाँ एक समाधान है:
(Math.random().toString(36)+'00000000000000000').slice(2, N+2)
दूसरा, मूल और समाधान दोनों उपरोक्त स्ट्रिंग आकार N को 16 वर्णों तक सीमित करते हैं। निम्नलिखित किसी भी एन के लिए आकार एन की एक स्ट्रिंग लौटाएगा (लेकिन ध्यान दें कि एन> 16 का उपयोग यादृच्छिकता में वृद्धि नहीं करेगा या टकराव की संभावना कम करेगा):
Array(N+1).join((Math.random().toString(36)+'00000000000000000').slice(2, 18)).slice(0, N)
स्पष्टीकरण:
आगे के विचार:
अपडेट करें:
यहाँ कुछ अन्य कार्यात्मक-शैली वाले एक-लाइनर हैं, जिनके साथ मैं आया था। वे उपरोक्त समाधान से भिन्न हैं:
तो, कहते हैं कि आपकी पसंद की वर्णमाला है
var s = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
फिर ये दोनों एक-दूसरे के समतुल्य हैं, इसलिए आप इनमें से जो भी आपके लिए अधिक सहज हो, चुन सकते हैं:
Array(N).join().split(',').map(function() { return s.charAt(Math.floor(Math.random() * s.length)); }).join('');
तथा
Array.apply(null, Array(N)).map(function() { return s.charAt(Math.floor(Math.random() * s.length)); }).join('');
संपादित करें:
मुझे लगता है कि क्वेइते और मार्टिज़न डे मिलियानो बाद के (कुडोस!) के समान समाधान के साथ आए थे, जिसे मैंने किसी तरह याद किया। जब से वे एक नज़र में कम नहीं दिखते, मैं इसे वैसे भी छोड़ दूँगा जब कोई वास्तव में वन-लाइनर चाहता है :-)
इसके अलावा, कुछ और बाइट्स को हटाने के लिए सभी समाधानों में 'ऐरे' के साथ 'नए एरे' को बदल दिया।
(Math.random()+1).toString(36).substring(7);
Math.random().toString(36).substring(2,7)
से एक अपेक्षित परिणाम मिलता है जो अधिक पसंद है.substring(2, n+2)
Array.apply(null, {length: 5}).map(function() { return s.charAt(Math.floor(Math.random() * s.length)); }).join('')
सबसे कॉम्पैक्ट समाधान, क्योंकि slice
की तुलना में कम है substring
। स्ट्रिंग के अंत से घटाकर random
फ़ंक्शन द्वारा उत्पन्न फ्लोटिंग पॉइंट प्रतीक से बचने की अनुमति देता है :
Math.random().toString(36).slice(-5);
या और भी
(+new Date).toString(36).slice(-5);
अद्यतन:btoa
विधि का उपयोग कर एक और दृष्टिकोण जोड़ा गया :
btoa(Math.random()).slice(0, 5);
btoa(+new Date).slice(-7, -2);
btoa(+new Date).substr(-7, 5);
// Using Math.random and Base 36:
console.log(Math.random().toString(36).slice(-5));
// Using new Date and Base 36:
console.log((+new Date).toString(36).slice(-5));
// Using Math.random and Base 64 (btoa):
console.log(btoa(Math.random()).slice(0, 5));
// Using new Date and Base 64 (btoa):
console.log(btoa(+new Date).slice(-7, -2));
console.log(btoa(+new Date).substr(-7, 5));
Math.random().toString(36).slice(-5);
- क्या Math.random()
लौटा 0.0
?
"0"
;)
Math.random()
रिटर्न 0.5
परिणाम है "0.i"
। यकीन नहीं होता कि दूसरे किनारे मामले हैं। केवल यह इंगित करना चाहता था कि यह प्रश्न का सही उत्तर नहीं है ([a-zA-Z0-9] से 5 वर्ण)।
(+new Date + Math.random())
से इस मामले को रोकने के लिए उपयोग करता हूं । वैसे भी, नोट के लिए धन्यवाद।
कुछ इस तरह से काम करना चाहिए
function randomString(len, charSet) {
charSet = charSet || 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
var randomString = '';
for (var i = 0; i < len; i++) {
var randomPoz = Math.floor(Math.random() * charSet.length);
randomString += charSet.substring(randomPoz,randomPoz+1);
}
return randomString;
}
डिफ़ॉल्ट चारसेट के साथ कॉल करें [a-zA-Z0-9] या अपने में भेजें:
var randomValue = randomString(5);
var randomValue = randomString(5, 'PICKCHARSFROMTHISSET');
len
एक while
लूप में सीधे
Es6 प्रसार ऑपरेटर के साथ एक नया संस्करण :
[...Array(30)].map(() => Math.random().toString(36)[2]).join('')
30
मनमाना संख्या, आप किसी भी टोकन लंबाई आप चाहते हैं चुन सकते हैं है36
आप के लिए पारित कर सकते हैं अधिकतम मूलांक संख्या है numeric.toString () , जिसका अर्थ है सभी नंबरों और az छोटे अक्षरों2
यादृच्छिक स्ट्रिंग जो इस तरह दिखता है से 3th सूचकांक लेने के लिए प्रयोग किया जाता है: "0.mfbiohx64i"
, हम के बाद किसी भी सूचकांक ले सकता है0.
function randomstring(L) {
var s = '';
var randomchar = function() {
var n = Math.floor(Math.random() * 62);
if (n < 10) return n; //1-10
if (n < 36) return String.fromCharCode(n + 55); //A-Z
return String.fromCharCode(n + 61); //a-z
}
while (s.length < L) s += randomchar();
return s;
}
console.log(randomstring(5));
while(s.length< L) s+= randomchar();
while(L--)
करेंगे
'A'.charCodeAt(0)
मैजिक नंबर 55
(और इसी तरह 61
) के बजाय अधिक मजबूत उपयोग करने के लिए बेहतर है । विशेष रूप से, मेरे मंच पर वैसे भी, जादुई संख्या जो वापस आती है 65
। यह कोड बेहतर होने के साथ ही स्व-दस्तावेज भी होगा।
/**
* Pseudo-random string generator
* http://stackoverflow.com/a/27872144/383904
* Default: return a random alpha-numeric string
*
* @param {Integer} len Desired length
* @param {String} an Optional (alphanumeric), "a" (alpha), "n" (numeric)
* @return {String}
*/
function randomString(len, an) {
an = an && an.toLowerCase();
var str = "",
i = 0,
min = an == "a" ? 10 : 0,
max = an == "n" ? 10 : 62;
for (; i++ < len;) {
var r = Math.random() * (max - min) + min << 0;
str += String.fromCharCode(r += r > 9 ? r < 36 ? 55 : 61 : 48);
}
return str;
}
console.log(randomString(10)); // i.e: "4Z8iNQag9v"
console.log(randomString(10, "a")); // i.e: "aUkZuHNcWw"
console.log(randomString(10, "n")); // i.e: "9055739230"
यद्यपि उपरोक्त वांछित ए / एन, ए, एन आउटपुट के लिए अतिरिक्त चेक का उपयोग करता है , चलो इसे बेहतर समझ के लिए आवश्यक (केवल अल्फा-न्यूमेरिक) के लिए तोड़ दें:
var str = "";
यादृच्छिक वर्णों को समेटने के लिए एक रिक्त स्ट्रिंग बनाएंrand
इंडेक्स नंबर बनाएं (0..9 + A..Z + a..z = 62)rand
CharCode
str
एक को समेटनाString.fromCharCode( incremented rand )
आइए ASCII चरित्र तालिका श्रेणियों की तस्वीर देखें :
_____0....9______A..........Z______a..........z___________ Character
| 10 | | 26 | | 26 | Tot = 62 characters
48....57 65..........90 97..........122 CharCode ranges
Math.floor( Math.random * 62 )
से एक सीमा देता है 0..61
( जिसकी हमें आवश्यकता है)।
चलो सही चारकोड श्रेणियों को प्राप्त करने के लिए यादृच्छिक को ठीक करें :
| rand | charCode | (0..61)rand += fix = charCode ranges |
------+----------+----------+--------------------------------+-----------------+
0..9 | 0..9 | 48..57 | rand += 48 = 48..57 |
A..Z | 10..35 | 65..90 | rand += 55 /* 90-35 = 55 */ = 65..90 |
a..z | 36..61 | 97..122 | rand += 61 /* 122-61 = 61 */ = 97..122 |
सशर्त आपरेशन तर्क उपरोक्त तालिका से:
rand += rand>9 ? ( rand<36 ? 55 : 61 ) : 48 ;
// rand += true ? ( true ? 55 else 61 ) else 48 ;
ऊपर दिए गए स्पष्टीकरण से, यहाँ परिणामी अल्फा-न्यूमेरिक स्निपेट है :
function randomString(len) {
var str = ""; // String result
for (var i = 0; i < len; i++) { // Loop `len` times
var rand = Math.floor(Math.random() * 62); // random: 0..61
var charCode = rand += rand > 9 ? (rand < 36 ? 55 : 61) : 48; // Get correct charCode
str += String.fromCharCode(charCode); // add Character to str
}
return str; // After all loops are done, return the concatenated string
}
console.log(randomString(10)); // i.e: "7GL9F0ne6t"
या अगर आप:
const randomString = (n, r='') => {
while (n--) r += String.fromCharCode((r=Math.random()*62|0, r+=r>9?(r<36?55:61):48));
return r;
};
console.log(randomString(10))
सबसे सरल तरीका है:
(new Date%9e6).toString(36)
यह वर्तमान समय के आधार पर 5 वर्णों के यादृच्छिक तार उत्पन्न करता है। उदाहरण आउटपुट है 4mtxj
या 4mv90
या4mwp1
इसके साथ समस्या यह है कि यदि आप इसे एक ही सेकंड में दो बार कॉल करते हैं, तो यह एक ही स्ट्रिंग उत्पन्न करेगा।
सुरक्षित तरीका है:
(0|Math.random()*9e6).toString(36)
यह हमेशा अलग-अलग 4 या 5 अक्षरों का एक यादृच्छिक स्ट्रिंग उत्पन्न करेगा। उदाहरण आउटपुट है की तरह 30jzm
या 1r591
या4su1a
दोनों तरह से पहला भाग एक यादृच्छिक संख्या उत्पन्न करता है। .toString(36)
भाग इसके बारे में एक base36 (alphadecimal) प्रतिनिधित्व करने के लिए संख्या डाली।
(+new Date).toString(36)
(0|Math.random()*6.04e7).toString(36)
कवर करने के साथ बदल सकें।
(Math.random()*1e20).toString(36)
:।
यहाँ कुछ आसान एक लाइनर हैं। new Array(5)
लंबाई सेट करने के लिए बदलें ।
0-9a-z
new Array(5).join().replace(/(.|$)/g, function(){return ((Math.random()*36)|0).toString(36);})
0-9a-zA-Z
new Array(5).join().replace(/(.|$)/g, function(){return ((Math.random()*36)|0).toString(36)[Math.random()<.5?"toString":"toUpperCase"]();});
मुझे पता है कि सभी को यह पहले से ही मिल गया है, लेकिन मुझे ऐसा महसूस हुआ कि इस तरह से सबसे अधिक हल्के तरीके से संभव हो सकता है (कोड पर प्रकाश, सीपीयू नहीं):
function rand(length, current) {
current = current ? current : '';
return length ? rand(--length, "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz".charAt(Math.floor(Math.random() * 60)) + current) : current;
}
console.log(rand(5));
आपके सिर को चारों ओर लपेटने में थोड़ा समय लगता है, लेकिन मुझे लगता है कि यह वास्तव में दिखाता है कि जावास्क्रिप्ट का सिंटैक्स कितना भयानक है।
current = current ? current : '';
तो जब आप लिख सकते हैं तो क्यों लिखें current = current || ''
;
current || (current = '');
यदि आप लोदाश या अंडरस्कोर का उपयोग कर रहे हैं , तो यह इतना सरल है:
var randomVal = _.sample('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', 5).join('');
_.sampleSize('asdfgh',5).join('')
आवश्यकता को पूरा करने के लिए [a-zA-Z0-9] और लंबाई = 5 का उपयोग करें
btoa(Math.random()).substr(5, 5);
लोअरकेस अक्षर, अपरकेस अक्षर और संख्याएँ घटित होंगी।
मामले में किसी को भी एक लाइनर में दिलचस्पी है (हालांकि आपकी सुविधा के लिए इस तरह के स्वरूपित नहीं) जो एक ही बार में स्मृति आवंटित करता है (लेकिन ध्यान दें कि छोटे तारों के लिए यह वास्तव में कोई फर्क नहीं पड़ता) यहां यह है कि यह कैसे करना है:
Array.apply(0, Array(5)).map(function() {
return (function(charset){
return charset.charAt(Math.floor(Math.random() * charset.length))
}('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'));
}).join('')
आप अपनी 5
इच्छित स्ट्रिंग की लंबाई से बदल सकते हैं। इस पद के लिए @AriyaHidayat का धन्यवाद कि इसmap
समारोह के समाधान के लिए विरल सरणी पर काम नहीं कर रहा है Array(5)
।
यहां मैंने जो विधि बनाई है।
यह एक स्ट्रिंग बनाएगा जिसमें अपरकेस और लोअरकेस अक्षर दोनों होंगे।
इसके अलावा, मैंने उस फ़ंक्शन को शामिल किया है जो एक अल्फ़ान्यूमेरिक स्ट्रिंग भी बनाएगा।
काम के उदाहरण:
http://jsfiddle.net/greatbigmassive/vhsxs/ (केवल अल्फा)
http://jsfiddle.net/greatbigmassive/PJwg8/ (अल्फ़ान्यूमेरिक)
function randString(x){
var s = "";
while(s.length<x&&x>0){
var r = Math.random();
s+= String.fromCharCode(Math.floor(r*26) + (r>0.5?97:65));
}
return s;
}
जुलाई 2015 को अपग्रेड करें
यह वही काम करता है लेकिन अधिक समझ में आता है और इसमें सभी पत्र शामिल हैं।
var s = "";
while(s.length<x&&x>0){
v = Math.random()<0.5?32:0;
s += String.fromCharCode(Math.round(Math.random()*((122-v)-(97-v))+(97-v)));
}
मान लें कि आप अंडरस्कोरज का उपयोग करते हैं, तो यह केवल दो लाइनों में यादृच्छिक स्ट्रिंग उत्पन्न करना संभव है:
var possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
var random = _.sample(possible, 5).join('');
const c = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
const s = [...Array(5)].map(_ => c[~~(Math.random()*c.length)]).join('')
तेज और बेहतर एल्गोरिथ्म। वर्दी की गारंटी नहीं है (टिप्पणी देखें)।
function getRandomId(length) {
if (!length) {
return '';
}
const possible =
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
let array;
if ('Uint8Array' in self && 'crypto' in self && length <= 65536) {
array = new Uint8Array(length);
self.crypto.getRandomValues(array);
} else {
array = new Array(length);
for (let i = 0; i < length; i++) {
array[i] = Math.floor(Math.random() * 62);
}
}
let result = '';
for (let i = 0; i < length; i++) {
result += possible.charAt(array[i] % 62);
}
return result;
}
crypto.getRandomValues
256 अद्वितीय मानों में से एक देता है। क्योंकि 256 को 62 से विभाजित नहीं किया जाता है, इसलिए आप वर्ण AH प्राप्त करने की थोड़ी अधिक संभावना रखते हैं। मुझे लगता है कि सबसे अच्छा समाधान यह है कि YouTube ने क्या किया है, और सिर्फ 2 अतिरिक्त वर्ण (संभवतः -
और _
) को charset में जोड़ें। वैसे भी, महान काम - इस जवाब को बहुत अधिक प्यार की आवश्यकता है :)
के लिए प्रतिक्रियाओं के साथ समस्या "मैं यादृच्छिक तार की जरूरत है" सवाल (जो भी भाषा में) हर समाधान की एक त्रुटिपूर्ण प्राथमिक विनिर्देशन का उपयोग करता व्यावहारिक रूप है स्ट्रिंग की लंबाई । सवाल खुद ही शायद ही कभी प्रकट करते हैं कि यादृच्छिक तार की आवश्यकता क्यों है, लेकिन मैं चुनौती देता हूं कि आपको शायद ही कभी लंबाई के यादृच्छिक तार की आवश्यकता होगी, कहते हैं 8. आपको क्या आवश्यकता है कुछ अद्वितीय तार की संख्या है , उदाहरण के लिए, किसी उद्देश्य के लिए पहचानकर्ता के रूप में उपयोग करने के लिए।
कड़ाई से अद्वितीय स्ट्रिंग्स प्राप्त करने के लिए दो प्रमुख तरीके हैं: नियतात्मक रूप से (जो यादृच्छिक नहीं है) और स्टोर / तुलना (जो कि शानदार है)। हम क्या करें? हम भूत छोड़ देते हैं। हम इसके बजाय संभाव्य विशिष्टता के साथ जाते हैं । यही है, हम स्वीकार करते हैं कि कुछ (हालांकि छोटा) जोखिम है कि हमारे तार अद्वितीय नहीं होंगे। यह वह जगह है जहां टकराव की संभावना और एन्ट्रॉपी को समझना मददगार है।
इसलिए मैं पुनरावृत्ति की आवश्यकता को फिर से दोहराऊंगा क्योंकि दोहराने के एक छोटे जोखिम के साथ तार की कुछ संख्या की आवश्यकता होती है। एक ठोस उदाहरण के रूप में, मान लें कि आप 5 मिलियन आईडी की क्षमता उत्पन्न करना चाहते हैं। आप प्रत्येक नए स्ट्रिंग को स्टोर और तुलना नहीं करना चाहते हैं, और आप चाहते हैं कि वे यादृच्छिक हो, इसलिए आप दोहराने के कुछ जोखिम को स्वीकार करते हैं। उदाहरण के लिए, मान लें कि एक ट्रिलियन रिपीट के 1 से कम जोखिम है। तो आपको किस लंबाई की स्ट्रिंग की आवश्यकता है? ठीक है, यह प्रश्न अस्वाभाविक है क्योंकि यह इस्तेमाल किए गए पात्रों पर निर्भर करता है। लेकिन इससे भी महत्वपूर्ण बात यह है कि यह गुमराह है। आपको जो चाहिए वह स्ट्रिंग्स के एन्ट्रापी का एक विनिर्देश है, न कि उनकी लंबाई। एन्ट्रापी सीधे कुछ संख्याओं में दोहराने की संभावना से संबंधित हो सकती है। स्ट्रिंग की लंबाई नहीं हो सकती।
और यह वह जगह है जहां EntropyString जैसी लाइब्रेरी मदद कर सकती है। रैंडम आईडी उत्पन्न करने के लिए जिसमें 5 मिलियन स्ट्रिंग्स में दोहराने के ट्रिलियन संभावना में 1 से कम है entropy-string
:
import {Random, Entropy} from 'entropy-string'
const random = new Random()
const bits = Entropy.bits(5e6, 1e12)
const string = random.string(bits)
"44hTNghjNHGGRHqH9"
entropy-string
डिफ़ॉल्ट रूप से 32 वर्णों के साथ सेट वर्ण का उपयोग करता है। अन्य पूर्वनिर्धारित वर्ण सेट हैं, और आप अपने स्वयं के पात्रों को भी निर्दिष्ट कर सकते हैं। उदाहरण के लिए, उपरोक्त एंट्री के साथ आईडी का निर्माण करना लेकिन हेक्स वर्णों का उपयोग करना:
import {Random, Entropy, charSet16} from './entropy-string'
const random = new Random(charSet16)
const bits = Entropy.bits(5e6, 1e12)
const string = random.string(bits)
"27b33372ade513715481f"
उपयोग किए गए वर्ण सेट में वर्णों की कुल संख्या के अंतर के कारण स्ट्रिंग की लंबाई में अंतर पर ध्यान दें। संभावित तारों की निर्दिष्ट संख्या में दोहराने का जोखिम समान है। स्ट्रिंग की लंबाई नहीं है। और सबसे अच्छा, दोहराने का जोखिम और तारों की संभावित संख्या स्पष्ट है। स्ट्रिंग की लंबाई के साथ कोई अनुमान नहीं है।
function randomString (strLength, charSet) {
var result = [];
strLength = strLength || 5;
charSet = charSet || 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
while (--strLength) {
result.push(charSet.charAt(Math.floor(Math.random() * charSet.length)));
}
return result.join('');
}
यह उतना ही साफ है जितना इसे मिलेगा। यह तेज भी है, http://jsperf.com/ay-random-string ।
strLength - 1
: - /
--strLength
हैstrLength--
मेरे लिए इसे ठीक करना।
आप मदों की एक सरणी के माध्यम से लूप कर सकते हैं और फिर से उन्हें एक स्ट्रिंग चर में जोड़ सकते हैं, उदाहरण के लिए यदि आप एक यादृच्छिक डीएनए अनुक्रम चाहते थे:
function randomDNA(len) {
len = len || 100
var nuc = new Array("A", "T", "C", "G")
var i = 0
var n = 0
s = ''
while (i <= len - 1) {
n = Math.floor(Math.random() * 4)
s += nuc[n]
i++
}
return s
}
console.log(randomDNA(5));
मुझे लोअरकेस और अपरकेस वर्णों के समर्थन के लिए एक स्वच्छ समाधान नहीं मिला।
लोअरकेस केवल समर्थन:
Math.random().toString(36).substr(2, 5)
लोअरकेस और अपरकेस का समर्थन करने के लिए उस समाधान पर बिल्डिंग:
Math.random().toString(36).substr(2, 5).split('').map(c => Math.random() < 0.5 ? c.toUpperCase() : c).join('');
अपनी ज़रूरत की लंबाई में समायोजित करने के लिए 5
में बदलें substr(2, 5)
।
एक लाइन:
Array(15).fill(null).map(() => Math.random().toString(36).substr(2)).join('')
// Outputs: 0h61cbpw96y83qtnunwme5lxk1i70a6o5r5lckfcyh1dl9fffydcfxddd69ada9tu9jvqdx864xj1ul3wtfztmh2oz2vs3mv6ej0fe58ho1cftkjcuyl2lfkmxlwua83ibotxqc4guyuvrvtf60naob26t6swzpil
Array(15)
मूल्य में छोटे परिवर्तन तर्क बनाने के लिए। उदाहरण के लिए: Array(4)
।
यह सुनिश्चित करने के लिए काम करता है
<script language="javascript" type="text/javascript">
function randomString() {
var chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz";
var string_length = 8;
var randomstring = '';
for (var i=0; i<string_length; i++) {
var rnum = Math.floor(Math.random() * chars.length);
randomstring += chars.substring(rnum,rnum+1);
}
document.randform.randomfield.value = randomstring;
}
</script>
इस तरह से कुछ के बारे में कैसे: Date.now().toString(36)
बहुत यादृच्छिक नहीं है, लेकिन छोटी और काफी अनोखी हर बार जब आप इसे कहते हैं।
Date.now()
केवल मिलीसेकंड रिज़ॉल्यूशन है। जब एक साधारण लूप में चलते हैं, उदाहरण के लिए, आपको बहुत सारे डुप्लिकेट मिलेंगे। for (let i = 0; i < 10; ++i) { console.log(Date.now().toString(36)); }
।
function randStr(len) {
let s = '';
while (s.length < len) s += Math.random().toString(36).substr(2, len - s.length);
return s;
}
// usage
console.log(randStr(50));
इस फ़ंक्शन का लाभ यह है कि आप विभिन्न लंबाई यादृच्छिक स्ट्रिंग प्राप्त कर सकते हैं और यह स्ट्रिंग की लंबाई सुनिश्चित करता है।
function randStr(len) {
let s = '';
while (len--) s += String.fromCodePoint(Math.floor(Math.random() * (126 - 33) + 33));
return s;
}
// usage
console.log(randStr(50));
function randStr(len, chars='abc123') {
let s = '';
while (len--) s += chars[Math.floor(Math.random() * chars.length)];
return s;
}
// usage
console.log(randStr(50));
console.log(randStr(50, 'abc'));
console.log(randStr(50, 'aab')); // more a than b
var possible
स्वीकृत उत्तर में एक जोड़ सकते हैं तो यह अच्छा होगा , इसलिए फ़ंक्शन का परिणाम अधिक कॉन्फ़िगर करने योग्य है।
10 वर्ण लंबे स्ट्रिंग उत्पन्न करें। लंबाई पैरामीटर (डिफ़ॉल्ट 10) द्वारा निर्धारित की जाती है।
function random_string_generator(len) {
var len = len || 10;
var str = '';
var i = 0;
for(i=0; i<len; i++) {
switch(Math.floor(Math.random()*3+1)) {
case 1: // digit
str += (Math.floor(Math.random()*9)).toString();
break;
case 2: // small letter
str += String.fromCharCode(Math.floor(Math.random()*26) + 97); //'a'.charCodeAt(0));
break;
case 3: // big letter
str += String.fromCharCode(Math.floor(Math.random()*26) + 65); //'A'.charCodeAt(0));
break;
default:
break;
}
}
return str;
}
आप कोडरन का उपयोग कर सकते हैं । यह दिए गए पैटर्न के अनुसार यादृच्छिक कोड उत्पन्न करने के लिए एक पुस्तकालय है। #
ऊपरी और निचले वर्णों के साथ ही अंकों के लिए प्लेसहोल्डर के रूप में उपयोग करें :
var cr = new CodeRain("#####");
console.log(cr.next());
अन्य प्लेसहोल्डर हैं जैसे A
अपरकेस अक्षर या 9
अंकों के लिए।
जो उपयोगी हो सकता है, वह है कॉलिंग .next()
आपको हमेशा एक अनूठा परिणाम देगी ताकि आपको डुप्लिकेट के बारे में चिंता न करनी पड़े।
यहां एक डेमो एप्लिकेशन है जो अद्वितीय यादृच्छिक कोड की एक सूची बनाता है ।
पूर्ण प्रकटीकरण: मैं कोडरैन का लेखक हूं।
true-random
परिणाम है! वे ही हैंpseudo-random
। सुरक्षा या सुरक्षा के लिए यादृच्छिक तारों का उपयोग करते समय, उनमें से किसी का उपयोग न करें !!! इनमें से एक को आज़माएं: random.org