ජාවාස්ක්‍රිප්ට් හි අහඹු නූල් / අක්ෂර ජනනය කරන්න


1806

කට්ටලයෙන් අහඹු ලෙස තෝරාගත් අක්ෂර 5 කින් යුත් අක්ෂර මාලාවක් මට අවශ්‍යය [a-zA-Z0-9].

ජාවාස්ක්‍රිප්ට් සමඟ මෙය කිරීමට හොඳම ක්‍රමය කුමක්ද?


49
අවවාදයයි: කිසිම පිළිතුරකට ප්‍රති true-randomresult ලයක් නැත! ඒවා පමණි pseudo-random. ආරක්ෂාව හෝ ආරක්ෂාව සඳහා අහඹු නූල් භාවිතා කරන විට, ඒවා කිසිවක් භාවිතා නොකරන්න !!! මෙම api වලින් එකක් උත්සාහ කරන්න: random.org
රොන් වැන් ඩර් හයිජ්ඩන්

49
. Math.random () toString (36) .replace (/ [^ az] + / ග්රෑම්, '')
Muaz ඛාන්

14
කරුණාකර විසඳුම විසඳුමකට දමන්න.
chryss

220
Math.random().toString(36).replace(/[^a-z]+/g, '').substr(0, 5);
ෆ්‍රෙඩ්රික්

Answers:


2473

මෙය ඔබට ප්‍රයෝජනවත් වනු ඇතැයි මම සිතමි:

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));


117
කෙටි නූල් සඳහා මෙය කදිමයි, නමුත් පරෙස්සම් වන්න, +=මේ වගේ නූල් භාවිතා කිරීමෙන් එය O (n ^ 2) හැසිරීමට හේතු වේ. ඔබට දිගු නූල් සෑදීමට අවශ්‍ය නම්, ඔබ තනි අක්ෂර පෙළක් සාදා අවසානයේ ඒවා එකට සම්බන්ධ කළ යුතුය.
dan_waterworth

97
@dan_waterworth එය බොහෝ විට පාහේ ප්රශ්නයක් නොවේ ඕනෑම අවස්ථාවක: codinghorror.com/blog/2009/01/...
ඇලෙක්ස් Reece

7
anan_waterworth, ඇත්ත වශයෙන්ම, +=කිසියම් හේතුවක් නිසා බොහෝ විට වේගවත් වන අතර, ලූප තුළ පවා භාවිතා වේ - jsperf.com/join-vs-concatenation
කොන්රාඩ්

19
On ජොනතන් පෝල්සන් මට අංක පෙන්වන්න . පෙර අදහස් jsperf සබැඳියක් හෝ jsperf.com/sad-tragedy-of-microoptimization හෝ sitepen.com/blog/2008/05/09/string-performance-an-analysis යනාදිය සමඟ බලන්න . එසේම, මෙම ප්‍රශ්නයට සම්බන්ධ වන්නේ සම්මුති 5 ක් පමණි .
ඇලෙක්ස් රීස්

11
@codenamejames කරුණාකර නැහැ ඔබගේ මුර පදය දැමීම තුළ මෙය භාවිතා කරන්න. එය ව්‍යාජ අහඹු ලෙස පමණක් ආරක්ෂිත නොවේ. ඔබ නෝඩ් භාවිතා කරන බව උපකල්පනය කරන්න (ඔබ සේවාදායකයාගේ පැත්තෙන් ලුණු දැමුවහොත් කොතැනින් පටන් ගත යුතුදැයි මට විශ්වාස නැත), cryptoඒ වෙනුවට භාවිතා කරන්න.
ජල තාප

2351

let r = Math.random().toString(36).substring(7);
console.log("random", r);

සටහන: ඉහත ඇල්ගොරිතමයට පහත සඳහන් දුර්වලතා ඇත:

  • පාවෙන ස්ථාන තද කරන විට පසුපස ශුන්‍ය ඉවත් වන නිසා එය අක්ෂර 0 ත් 6 ත් අතර ඕනෑම තැනක ජනනය වේ.
  • එය බිහිසුණු ලෙස සංකීර්ණ වන පාවෙන ලක්ෂ්‍ය සංඛ්‍යා දැඩි කිරීමට භාවිතා කරන ඇල්ගොරිතම මත ගැඹුරින් රඳා පවතී. ( "පාවෙන ස්ථාන අංක නිවැරදිව මුද්‍රණය කරන්නේ කෙසේද" යන ලිපිය බලන්න .)
  • Math.random()ක්‍රියාත්මක කිරීම මත පදනම්ව පුරෝකථනය කළ හැකි ("අහඹු පෙනුමක්" නමුත් ඇත්ත වශයෙන්ම අහඹු නොවේ) ප්‍රතිදානය නිපදවිය හැකිය. ඔබට අද්විතීයභාවය හෝ අනපේක්ෂිත බව සහතික කිරීමට අවශ්‍ය වූ විට ලැබෙන නූල සුදුසු නොවේ.
  • එය ඒකාකාර අහඹු, අනපේක්ෂිත අක්ෂර 6 ක් නිෂ්පාදනය කළද, උපන් දින විරුද්ධාභාෂය හේතුවෙන් ඔබට නූල් 50,000 ක් පමණ උත්පාදනය කිරීමෙන් පසු අනුපිටපතක් දැකීමට අපේක්ෂා කළ හැකිය . (වර්ග (36 ^ 6) = 46656)

278
Math.random().toString(36).substr(2, 5), .substring(7)එය අක්ෂර 5 ට වඩා දිගු වීමට හේතු වන බැවිනි . සම්පූර්ණ ලකුණු, තවමත්!
මකරා

81
Co ස්කූප් toStringජාවාස්ක්‍රිප්ට් හි අංක වර්ගයක ක්‍රමය ලබා දී ඇති පදනමක් බවට පරිවර්තනය කිරීම සඳහා විකල්ප පරාමිතියක් ගනී. ඔබ දෙකක් සමත් වුවහොත්, උදාහරණයක් ලෙස, ඔබේ අංකය ද්විමය වශයෙන් දැක්වේ. හෙක්ස් (16 වන පාදම) හා සමානව, 36 වන පදනම 9 න් ඔබ්බට ඉලක්කම් නිරූපණය කිරීම සඳහා අකුරු භාවිතා කරයි.
ක්‍රිස් බේකර්

76
ලස්සන පෙනුමක් ඇති නමුත් අවස්ථා කිහිපයකදී මෙය හිස් නූලක් ජනනය කරයි! අහඹු ලෙස 0, 0.5, 0.25, 0.125 ... ආපසු ලැබුවහොත් හිස් හෝ කෙටි නූලක් ලැබෙනු ඇත.
ගර්ටාස්

68
@gertas මෙය වළක්වා ගත හැකිය(Math.random() + 1).toString(36).substring(7);
ජෝර්ජ් රීත්

84
ගයි, මෙය සැබවින්ම නිෂ් .ල ය. එය 1000000 වතාවක් ධාවනය කරන්න, ඔබට සාමාන්‍යයෙන් පුනරාවර්තන 110000 ක් පමණ ලැබේ: var values ​​= {i, i = 0, duplicateCount = 0, val; අතර (i <1000000) {val = Math.random (). toString (36) .substring (7); if (අගයන් [val]) {duplicateCount ++; } අගයන් [val] = 1; i ++; ol console.log ("මුළු අනුපිටපත්", අනුපිටපත් ගණන);
hacklikecrack

476

Math.random මේ වගේ දෙයකට නරකයි

විකල්ප 1

ඔබට මෙම සේවාදායකය පැත්තෙන් කළ හැකි නම්, ක්‍රිප්ටෝ මොඩියුලය භාවිතා කරන්න -

var crypto = require("crypto");
var id = crypto.randomBytes(20).toString('hex');

// "bb5dc8842ca31d4603d6aa11448d1654"

එහි ප්‍රති string ලයක් ලෙස ඔබ ජනනය කරන අහඹු බයිට් මෙන් දෙගුණයක් දිගු වේ; හෙක්ස් වෙත කේතනය කර ඇති සෑම බයිටයක්ම අක්ෂර 2 කි. බයිට් 20 ක් හෙක්ස් අක්ෂර 40 ක් වනු ඇත.


විකල්ප 2

ඔබට මෙම සේවාදායකයා පැත්තෙන් කළ යුතු නම්, සමහර විට uuid මොඩියුලය උත්සාහ කරන්න -

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 dec < 10
    ? '0' + String(dec)
    : dec.toString(16)
}

// 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 බලන්න


4
හරියටම. යම් දෙයකට හැඳුනුම්පතක් පැවරීම සඳහා යූඅයිඅයිඩී හොඳ වුවත්, අහඹු අක්ෂර මාලාවක් ලෙස එය භාවිතා කිරීම මේ (සහ බොහෝ විට වෙනත්) හේතු සඳහා හොඳ අදහසක් නොවේ.
wmassingham

3
.map()විකල්ප 3 හි අවශ්‍ය නොවේ . Array.from(arr, dec2hex).join('')=== Array.from(arr).map(dec2hex).join(''). මෙම විශේෂාංග සඳහා මාව හඳුන්වා දීම ගැන ස්තූතියි :-)
ෆ්‍රෙඩ් ගාන්ඩ්

6
2 වන විකල්පය වැඩ කිරීමට node.js අවශ්‍ය බව ඔබ පිළිතුරෙහි සඳහන් කළ යුතුය, එය පිරිසිදු ජාවාස්ක්‍රිප්ට් නොවේ.
එස්කෝ

5
වඩා ගුප්ත විද්‍යාත්මකව ආරක්‍ෂිත වුවත්, මෙය ඇත්ත වශයෙන්ම ප්‍රශ්නයේ අවශ්‍යතා සපුරාලන්නේ නැත, මන්ද එය ප්‍රතිදානය කරන්නේ 0-9 සහ af (Hexadecimal) මිස 0-9, az, AZ නොවේ.
qJake

1
නොවේ ද requireපමණක් භාවිතා සර්වර්-සයිඩ් විය හැකි මොඩියුලය?
aJetHorn

176

කෙටි, පහසු සහ විශ්වසනීය

මෙහි ඇති ඉහළම ශ්‍රේණිගත කළ පිළිතුරු වලට සාපේක්ෂව හරියටම අහඹු අක්ෂර 5 ක් ලබා දෙයි.

Math.random().toString(36).substr(2, 5);

9
Math.random().toString(36)අක්ෂර 5 ට අඩු සංඛ්‍යාවක් ආපසු ලබා දෙන්නේ නම් කුමක් කළ යුතුද?
මයිකල් ලිට්වින්

3
හොඳයි, එය @ අපරෙසු වෙතින් ලබාගත් සිත්ගන්නා චෝදනාවකි, මම විසඳුම සොයාගත් බව නොකියමි, නමුත් මම දැන් වසර ගණනාවක් තිස්සේ මගේ ව්‍යාපෘතිවල එය භාවිතා කරමි. තවද ඔබ සඳහන් කළ අදහස් දැක්වීමට එයට කිසිදු සම්බන්ධයක් නැත. SO හි වැදගත් වන්නේ නිවැරදි ස්ථානයේ වඩාත්ම ප්‍රයෝජනවත් තොරතුරු බවත් එය දැනටමත් වෙනත් ස්ථානයක පැවතුනත් මට විශ්වාසයි. වාසනාවකට මෙන්, අවම වශයෙන් පිරිමි ළමයින් 51 දෙනෙකු මෙම පිළිතුර ප්‍රයෝජනවත් බව පෙනේ, ඔබව සාදරයෙන් පිළිගනිමු!
රිදී රින්ග්වී

3
Math.random () ප්‍රතිලාභ 0 හි හිස් නූල් ලබා ගැනීම වළක්වා ගැනීම සඳහා ඔබට භාවිතා කළ හැකියfunction getRandomString() { var result = ''; while (!result) result = Math.random().toString(36).substring(2); return result; };
mikep

5
@rinogo Math.random () නැවත පැමිණීමට 0 නමුත් 1 නොවේ developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
mikep

6
මම මෙම කේතය 1,000,000,000 වාරයක් ධාවනය කළ නමුත් තවමත් හිස් නූලක් ලැබුනේ නැත: jsfiddle.net/mtp5730r හිස් නූලක් ලබා ගැනීමෙන් ඔබ ආරක්ෂිත බව මම කියමි.
මැක්‍රෝමන්

157

මෙන්න ඩබල් ටැප් හි විශිෂ්ට පිළිතුරේ වැඩි දියුණු කිරීමක් . මුල් පිටපතෙහි අඩුපාඩු දෙකක් ඇත.

පළමුව, අනෙක් අය සඳහන් කර ඇති පරිදි, එයට කෙටි නූල් හෝ හිස් නූලක් නිපදවීමේ කුඩා සම්භාවිතාවක් ඇත (අහඹු අංකය 0 නම්), එමඟින් ඔබේ යෙදුම බිඳ දැමිය හැකිය. මෙන්න විසඳුමක්:

(Math.random().toString(36)+'00000000000000000').slice(2, N+2)

දෙවනුව, මුල් සහ විසඳුම යන දෙකම නූල් ප්‍රමාණය N අක්ෂර 16 කට සීමා කරයි. පහත දැක්වෙන්නේ ඕනෑම N සඳහා N ප්‍රමාණයේ නූලක් යවයි (නමුත් N> 16 භාවිතා කිරීමෙන් අහඹු බව වැඩි නොවන අතර isions ට්ටනවල සම්භාවිතාව අඩු නොවන බව සලකන්න):

Array(N+1).join((Math.random().toString(36)+'00000000000000000').slice(2, 18)).slice(0, N)

පැහැදිලි කිරීම:

  1. [0,1) පරාසයේ අහඹු අංකයක් තෝරන්න, එනම් 0 (ඇතුළත්) සහ 1 (විශේෂිත) අතර.
  2. අංකය පදනම් -36 නූල් බවට පරිවර්තනය කරන්න, එනම් 0-9 සහ az අක්ෂර භාවිතා කිරීම.
  3. ශුන්‍ය සමග පෑඩ් (පළමු ගැටළුව විසඳයි).
  4. ප්‍රමුඛ '0' කපා දමන්න උපසර්ගය සහ අමතර පෑඩින් ශුන්‍ය.
  5. අවම වශයෙන් N අක්ෂර වත් තිබීම සඳහා ප්‍රමාණවත් වාරයක් නැවත නැවත කරන්න (පරිසීමකය ලෙස භාවිතා කරන කෙටි අහඹු නූල් සමඟ හිස් නූල් සමඟ සම්බන්ධ වීමෙන්).
  6. නූලෙන් හරියටම N අක්ෂර කපා දමන්න.

වැඩිදුර අදහස්:

  • මෙම විසඳුම ලොකු අකුරු භාවිතා නොකරයි, නමුත් සෑම අවස්ථාවකම පාහේ (කිසිදු ද pun ුවමක් අපේක්ෂා නොකරයි) එය වැදගත් නොවේ.
  • මුල් පිළිතුරේ N = 16 හි උපරිම නූල් දිග මනිනු ලබන්නේ Chrome හි ය. ෆයර්ෆොක්ස් හි එය එන් = 11. නමුත් පැහැදිලි කළ පරිදි, දෙවන විසඳුම වන්නේ ඉල්ලූ ඕනෑම නූල් දිගකට සහය දැක්වීම මිස අහඹු ලෙස එකතු කිරීම ගැන නොවේ, එබැවින් එය වැඩි වෙනසක් නොකරයි.
  • Math.random () විසින් ලබා දුන් ප්‍රති results ල ඒකාකාරව බෙදා හරින තාක් දුරට, ආපසු ලබා දුන් සියලුම නූල් වලට සමාන සම්භාවිතාවක් ඇත (මෙය ගුප්ත ලේඛන ශක්තිය අහඹු ලෙස නොවේ, කෙසේ වෙතත්).
  • N ප්‍රමාණයේ හැකි සියලුම නූල් ආපසු ලබා දිය නොහැක. දෙවන විසඳුමේදී මෙය පැහැදිලිය (කුඩා නූල හුදෙක් අනුපිටපත් කර ඇති බැවින්), නමුත් මුල් පිළිතුරේ දී මෙය සත්‍ය වන්නේ පදනම් -36 බවට පරිවර්තනය කිරීමේදී අවසාන බිටු කිහිපය මුල් අහඹු බිටු වල කොටසක් නොවිය හැකි බැවිනි. Math.random () toString (36) හි ප්‍රති result ලය දෙස බැලුවහොත්, අවසාන අක්‍ෂරය ඒකාකාරව බෙදා හරිනු නොලැබේ. නැවතත්, සෑම අවස්ථාවකම පාහේ එය වැදගත් නොවේ, නමුත් අපි කෙටි නූල් (උදා: N = 1) බලපෑමට ලක් නොවන පරිදි අහඹු නූලක අවසානයට වඩා ආරම්භයේ සිට අවසාන නූල කපා දමමු.

යාවත්කාලීන කිරීම:

මෙන්න මම ඉදිරිපත් කළ තවත් ක්‍රියාකාරී විලාසිතාවේ එක්-ලයිනර් කිහිපයක්. ඉහත විසඳුමට වඩා ඒවා වෙනස් ය:

  • ඔවුන් පැහැදිලි අත්තනෝමතික හෝඩියක් භාවිතා කරයි (වඩා සාමාන්‍ය, සහ ලොකු අකුරු සහ කුඩා අකුරු යන දෙකම ඇසූ මුල් ප්‍රශ්නයට සුදුසු ය).
  • N හි සියලුම නූල් නැවත ලබා දීමට සමාන සම්භාවිතාවක් ඇත (එනම් නූල්වල පුනරාවර්තන නොමැත).
  • ඒවා පදනම් වී ඇත්තේ toString (36) උපක්‍රමයට වඩා සිතියම් ශ්‍රිතයක් මත වන අතර එමඟින් ඒවා වඩාත් සරල හා තේරුම් ගැනීමට පහසු වේ.

එබැවින්, ඔබේ තේරීමේ හෝඩිය යැයි කියන්න

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('');

සංස්කරණය කරන්න:

මට පෙනෙන්නේ ක්විබයිට් සහ මාටිජ්න් ඩි මිලියනෝ දෙවැන්න (කුඩෝස්!) හා සමාන විසඳුම් ඉදිරිපත් කළ අතර එය කෙසේ හෝ මග හැරුණි. ඔවුන් බැලූ බැල්මට කෙටියෙන් නොපෙනෙන හෙයින්, යමෙකුට එක ලයිනර් එකක් අවශ්‍ය නම් මම කෙසේ හෝ මෙහි තබමි :-)

එසේම, තවත් බයිට් කිහිපයක් රැවුල බෑම සඳහා සියලු විසඳුම්වල 'නව අරාව' වෙනුවට 'අරාව' ආදේශ කරන්න.


1 පමණක් එකතු නොකරන්නේ ඇයි? (Math.random()+1).toString(36).substring(7);
එමික්ස්

1 එකතු කිරීමෙන් මෙහි සාකච්ඡා කර ඇති ගැටළු දෙකෙන් එකක්වත් විසඳෙන්නේ නැත. උදාහරණයක් ලෙස, (1) .toString (36) .substring (7) හිස් නූලක් නිපදවයි.
amichair

භාවිතා Math.random().toString(36).substring(2,7)කිරීම අපේක්ෂිත ප්‍රති result ලයක් ලබා දෙයි.substring(2, n+2)
ජෝසප් රෙක්ස්

Array.apply(null, {length: 5}).map(function() { return s.charAt(Math.floor(Math.random() * s.length)); }).join('')
මුහම්මද් උමර්

මෙය විශිෂ්ටයි, නමුත් ෆයර්ෆොක්ස් හි N = 16 සමඟ ක්‍රියාත්මක කරන විට, අවසන් ~ 6 ඉලක්කම් ශුන්‍ය වේ ... (නමුත් එය අහඹු අක්ෂර 5 ක් සඳහා OP හි ආශාව තෘප්තිමත් කරයි.)
එඩ්වඩ් නිවෙල්

130

වඩාත්ම සංයුක්ත විසඳුම, 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";)
වැලන්ටින් පොඩ්කමේනි

2
හරියටම. ;) Math.random()නැවත ලබා දෙන්නේ නම් ප්‍රති 0.5result ලය වේ "0.i". වෙනත් අද්දර අවස්ථා තිබේදැයි විශ්වාස නැත. මෙය ප්‍රශ්නයට නිවැරදි පිළිතුරක් නොවන බව පෙන්වා දීමට අවශ්‍ය විය ([a-zA-Z0-9] හි අක්ෂර 5 ක්).
x-ray

2
@ එක්ස් කිරණ, මෙය නිවැරදි පිළිතුර යැයි මම නොකියමි, මම කියන්නේ මෙය ඉහත @oubletap පිළිතුරේ සංයුක්ත අනුවාදයක් බවයි. (+new Date + Math.random())මෙම නඩුව වැළැක්වීම සඳහා මම පෞද්ගලිකව භාවිතා කරමි . කෙසේ වෙතත්, සටහනට ස්තූතියි.
වැලන්ටින් පොඩ්කමේනි

1
මෙය. වෙනත් පිළිතුරු සඳහා මෙතරම් කේතයක් අවශ්‍ය වන්නේ මන්දැයි මම නොදනිමි
john ktejik

100

මේ වගේ දෙයක් වැඩ කළ යුතුයි

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');

උදාහරණ ප්‍රභේදයක් මෙහි සොයාගත හැකිය: mediacollege.com/internet/javascript/number/random.html
ඩේවිඩ්

1
හොඳින් පමණක් අඩු කිරීම් ලෙස ශක්තිය lenතුළ සෘජුවම whileපුඩුවක්
drzaus

ස්තූතියි, මම මේ උදාහරණයේ කෝපි පිටපත් විචල්‍යතාවයක් පහතින් පළ කළෙමි: stackoverflow.com/a/26682781/262379
ඩිනිස් ක

මේවා ප්‍රසිද්ධියේ භාවිතා කිරීමට යන්නේ නම්, ඔබ බොහෝ විට ස්වර ඉවත් කළ යුතුය. මඳක් අඩු එන්ට්‍රොපිය, නමුත් මිනිසුන්ට අමනාප විය හැකි වචන උත්පාදනය කළ නොහැකි බැවින් බොහෝ ආරක්ෂිතයි. මගේම අක්ෂර මාලාවක් යැවිය හැකි බැවින් මම මේකට කැමතියි. හොඳ වැඩක්.
නේට් බනී

73

Es6 පැතිරුම් ක්‍රියාකරු සමඟ නවතම අනුවාදය :

[...Array(30)].map(() => Math.random().toString(36)[2]).join('')

  • මෙම 30අත්තනෝමතික අංකය, ඔබට අවශ්ය ඕනෑම සංකේත දිග ලබා ගත හැක
  • මෙම 36ඔබ උරුම විය හැකි උපරිම radix අංකය numeric.toString () , ඉන් අදහස් වන්නේ, සියලු අංක සහ az සිම්පල් අකුරු
  • මෙම 2වන 3th දර්ශකය මේ වගේ වන අහඹු string සිට රැගෙන කිරීම සඳහා භාවිතා වේ: "0.mfbiohx64i"අපි පසු ඕනෑම දර්ශකය ගත විය හැකි0.

ඔබට පැහැදිලි කළ හැකිද? විශේෂයෙන් ඔබ 36 සිට toString () දක්වා සමත් වන්නේ ඇයි සහ ඔබ 3 වන අංගය තෝරා ගන්නේ ඇයි?
vuza

5
මේ තමයි හොඳම විසඳුම
overcomer

හොඳයි, නමුත් මෙම විසඳුමට [AZ] අක්ෂර ඉල්ලූ පරිදි ඇතුළත් නොවේ, [a-z0-9] පමණි
නහුවෙල් ග්‍රෙකෝ

72

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();
මාස්ටාබ්ලාස්ටා

3
එසේම while(L--)එය කරනු ඇත
vsync

2
'A'.charCodeAt(0)මැජික් අංකයට වඩා ශක්තිමත් ලෙස භාවිතා කිරීම වඩා හොඳය 55(ඒ හා සමානව 61). විශේෂයෙන් මගේ වේදිකාවේ කෙසේ වෙතත්, ආපසු එන මැජික් අංකය වේ 65. එම කේතය ස්වයං ලේඛනය ද වඩා හොඳ වනු ඇත.
ග්‍රම්ඩ්‍රිග්

ඔබගේ ක්‍රියාවට නැංවීමේ අවම ප්‍රශස්තිකරණය කළ (බයිට් 46 කුඩා) ප්‍රභේදයක් මම මෙහි නිර්මාණය කළෙමි: stackoverflow.com/a/52412162
වරුයාමා

වාසනාව කවදා හෝ එම වරුයාමා නිදොස් කිරීම. වෙබ් පැක් යනු එයයි!
ඩිලන් වොට්සන්

62

සසම්භාවී නූල් උත්පාදක යන්ත්රය (ඇල්ෆා-සංඛ්යා | ඇල්ෆා | සංඛ්යාත්මක)

/**
 * 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"


ඉහත දැක්වෙන්නේ අපේක්ෂිත දේ සඳහා අතිරේක චෙක්පත් භාවිතා කරන අතර A / N, A, N ප්‍රතිදානය කරන අතර, වඩා හොඳ අවබෝධයක් සඳහා එය අත්‍යවශ්‍ය දෑ (ඇල්ෆා-සංඛ්‍යාත්මකව පමණි) බිඳ දමමු:

  • තර්කයක් පිළිගන්නා ශ්‍රිතයක් සාදන්න (අහඹු සංගීත ප්‍රති result ලයේ අපේක්ෂිත දිග)
  • වැනි හිස් නූලක් සාදන්න var str = "";අහඹු අක්ෂර සංයුක්ත කිරීමට
  • ලූපයක් තුළ සිට දර්ශක අංකයක් සාදන්නrand 0 සිට 61 (0..9 + A..Z + a..z = 62)
  • නිර්මාණය කරන්න , කොන්දේසි තර්ක කිරීමට / විසඳුමක් ගැළපුම්randනිවැරදි CharCodeඅංකය සහ අදාළ අක්‍ෂරය නැවත ලබා ගැනීම සඳහා එය (එය 0..61 බැවින්) එය යම් සංඛ්‍යාවකින් වැඩි කිරීම (පහත උදාහරණ බලන්න) .
  • ලූපය තුළට සමපාත වේ str aString.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 ;

ඉහත පැහැදිලි කිරීමෙන්, මෙහි ප්‍රති ing ලයක් ලෙස ඇල්ෆා සංඛ්‍යාත්මක ස්නිපටය :

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))


පරිපූර්ණ පිළිතුර. ඔයාට බොහෝම ස්තූතියි.
රෝහිත් කුමාර්

1
ඔබට ස්තුතියි!! ඔබව සාදරයෙන් පිළිගනිමු @ රෝහිත් කුමාර්
රොකෝ සී.

34

සරලම ක්‍රමය නම්:

(new Date%9e6).toString(36)

මෙය වත්මන් කාලය මත පදනම්ව අක්ෂර 5 ක අහඹු නූල් ජනනය කරයි. නිදර්ශන ප්‍රතිදානය 4mtxjහෝ 4mv90හෝ4mwp1

මෙහි ඇති ගැටළුව නම්, ඔබ එය එකම තත්පරයකට දෙවරක් අමතන්නේ නම්, එය එකම නූලක් ජනනය කරනු ඇත.

ආරක්ෂිත ක්‍රමය නම්:

(0|Math.random()*9e6).toString(36)

මෙය අහඹු ලෙස අක්ෂර 4 ක් හෝ 5 ක් උත්පාදනය කරනු ඇත, සෑම විටම වෙනස් වේ. නිදර්ශන ප්‍රතිදානය සමාන 30jzmහෝ 1r591හෝ4su1a

දෙයාකාරයෙන්ම පළමු කොටස අහඹු සංඛ්‍යාවක් ජනනය කරයි. මෙම .toString(36)කොටස එය ක base36 (alphadecimal) නියෝජන කිරීමට සංඛ්යාව දමති.


මෙය ප්‍රශ්නයට පිළිතුරු දෙන්නේ කෙසේදැයි මට හරියටම විශ්වාස නැත; මෙය දැනටමත් වලංගු පිළිතුරු බොහොමයක් සහිත අවුරුදු 7 ක් පැරණි ප්‍රශ්නයකි. ඔබ නව පිළිතුරක් ලබා දීමට තෝරා ගන්නේ නම්, ඔබේ පිළිතුර හොඳින් පැහැදිලි කර ලේඛනගත කර ඇති බවට වග බලා ගැනීම සඳහා ඔබ සැබවින්ම අමතර සැලකිල්ලක් දැක්විය යුතුය.
ක්ලේස්

1
ඔබ දිනය භාවිතා කරන්නේ නම්, ඔබ එය එසේ භාවිතා නොකරන්නේ ඇයි:(+new Date).toString(36)
ජ්‍යෙෂ් senior කථිකාචාර්ය

මම ඔබේ අහඹු සංඛ්‍යා විසඳුමට කැමතියි, නමුත් 9e6 මගින් ඉලක්කම් 5 ක් (36 ^ 5) සඳහා මිලියන 60.4 ට වඩා මිලියන 9 ක හැකියාවන් ලබා දෙයි, එබැවින් ඔබට එය (0|Math.random()*6.04e7).toString(36)ආවරණය කිරීම සඳහා එය ප්‍රතිස්ථාපනය කළ හැකිය .
Le Droid

1
ගුප්ත විද්‍යාත්මකව විශ්මය ජනක වීමට අවශ්‍ය නොවන කෙටි කේත චර්යාවක් සහිත (කේත නිරූපණයක් සඳහා) දිගු අහඹු නූලක් මට අවශ්‍ය විය, හොඳ අහඹු දෘශ්‍ය “ෆ්ලෆ්” එකක් නිපදවන්න. මම මෙම පිළිතුරට හොඳම (ඔබේ දෙවැන්න) කැමතියි, එබැවින් ඔබට ස්තූතියි. මගේ ශත දෙක: අඩු යතුරු එබීමකින් මට එය කෙටි කළ හැකිය, එය සාමාන්‍යයෙන් අහඹු අක්ෂර 13 ක් (කාල පරිච්ඡේදයක් නොමැතිව) නිපදවනු ඇත : (Math.random()*1e20).toString(36).
ඇන්ඩ rew විලම්ස්

මෙම පිළිතුර සමඟ මා සතුව ඇති එක් සුදුසුකමක් නම්, එය [AZ] භාවිතා නොකිරීමයි.
user.friendly

22

මෙන්න පහසු එක් ලයිනර් කිහිපයක්. වෙනස් කරන්න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"]();});

20

සෑම කෙනෙකුම දැනටමත් එය නිවැරදිව ලබාගෙන ඇති බව මම දනිමි, නමුත් මට හැඟී ගියේ හැකි තරම් සැහැල්ලු ආකාරයකින් මෙය කළ හැකි බවයි (කේතයේ ආලෝකය, CPU නොවේ):

function rand(length, current) {
  current = current ? current : '';
  return length ? rand(--length, "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz".charAt(Math.floor(Math.random() * 60)) + current) : current;
}

console.log(rand(5));

ඔබේ හිස එතීමට මඳ වේලාවක් ගත වේ, නමුත් මම සිතන්නේ එය සැබවින්ම ජාවාස්ක්‍රිප්ට් හි වාක්‍ය ඛණ්ඩය කෙතරම් විශිෂ්ටද යන්න පෙන්නුම් කරයි.


21
ඔබ කේතය කෙටියෙන් තබා ගැනීමට උත්සාහ කරන්නේ නම්, ඔබට ලිවිය හැකි current = current ? current : '';විට ලියන්න current = current || ''.
CaffGeek

10
අපි මෙහි ක්ෂුද්‍ර ප්‍රශස්තිකරණය ගැන කතා කරන බැවින් අවශ්‍ය නම් විචල්‍ය පැවරුම සම්පූර්ණයෙන්ම මඟ හැරීමට මම යෝජනා කරමි:current || (current = '');
තෝමස් හේමන්

“කදිම” නමුත් සම්පත් නාස්ති කිරීමේ පුනරාවර්තන ඇල්ගොරිතමයක් භාවිතා කරන විට ක්ෂුද්‍ර ප්‍රශස්තිකරණය කිරීමට උත්සාහ කිරීම තේරුමක් නැත :-) ධාවන කාලවල ප්‍රශස්තිකරණ කේතයේ විශාල දියුණුවක් ඇති වන තෙක් ලූප් සඳහා ලාවා තවමත් ජාවාස්ක්‍රිප්ට් හි හොඳම වන අතර පුනරාවර්තන විශාල වේලාවට පහර දෙයි.
මරේ

17

ඔබ භාවිතා කරන්නේ නම් Lodash හෝ Underscore , එය ඉතා සරළ:

var randomVal = _.sample('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', 5).join('');

6
ලොඩාෂ් භාවිතා කරයි_.sampleSize('asdfgh',5).join('')
මාර්ලෝ

2
මෙය සැබවින්ම හොඳ විසඳුමක් නොවේ, මන්ද එක් එක් ලේඛනයට එක් එක් අක්ෂර අද්විතීය දර්ශකයකින් වන බැවිනි. එයින් අදහස් වන්නේ එය සැබවින්ම අහඹු නොවන බැවින් කිසිදු චරිතයකට නැවත නැවත කළ නොහැකි බවයි.
random_user_name

17

අවශ්‍යතාවය සපුරාලීම සඳහා [a-zA-Z0-9] සහ දිග = 5 භාවිතය

btoa(Math.random()).substr(5, 5);

කුඩා අකුරු, ලොකු අකුරු සහ අංක සිදුවනු ඇත.


1
මම හිතන්නේ, Math.random () අක්ෂර 64 ක් සහිත base64-string වෙත යොමු විය හැකිය.
ලීෆ්

14

මතකය එකවර වෙන් කරන එක් ලයිනර් එකක් (ඔබේ පහසුව සඳහා ආකෘතිකරණය කර නොතිබුණද) යමෙකු උනන්දු වන්නේ නම් (නමුත් කුඩා නූල් සඳහා එය ඇත්ත වශයෙන්ම වැදගත් නොවන බව සලකන්න) මෙහි එය කරන්නේ කෙසේද:

Array.apply(0, Array(5)).map(function() {
    return (function(charset){
        return charset.charAt(Math.floor(Math.random() * charset.length))
    }('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'));
}).join('')

ඔබට අවශ්‍ය නූලෙහි 5දිග අනුව ප්‍රතිස්ථාපනය කළ හැකිය . විසින් නිර්මාණය කරන ලද විරල අරාව මත ක්‍රියා නොකිරීමේ ශ්‍රිතයට විසඳුම ලබා දීම සඳහා මෙම ලිපියේ riAriyaHidayat ට ස්තූතියි .mapArray(5)


13
සෑම ජාවාස්ක්‍රිප්ට් වැඩසටහනක්ම ඔබ එය
හැඩගස්වා

13

මෙන්න මම නිර්මාණය කළ ක්රමය.
එය ලොකු අකුරු සහ කුඩා අකුරු අඩංගු නූලක් නිර්මාණය කරයි.
ඊට අමතරව මම අක්ෂරාංක නූලක් නිර්මාණය කරන ශ්‍රිතයද ඇතුළත් කර ඇත්තෙමි.

වැඩ කරන උදාහරණ:
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)));
}

මෙම ශ්‍රිතය සමඟ, ඔබට කිසි විටෙකත් 'එම්' ට වඩා විශාල අකුරක් හෝ 'එන්' ට වඩා අඩු අකුරක් ලබා ගත නොහැක.
erkanyildiz

ඇත්තටම? ඔහ්! බොහෝ විට එය පසුව පරීක්ෂා කරනු ඇත. හ්ම්, කෙසේ වෙතත්, එය අහඹු නූලක් ලබා දී ඇති අතර, එහි ඇති අකුරු මොනවාදැයි අපි සැබවින්ම ගණන් ගන්නේ නැත (ඒවා අහඹු ලෙස පවතින තාක් කල්) එය තවමත් අපට අවශ්‍ය දේ කරයි, එය වැදගත් වන නමුත් ඔව්, එය සපයනු ඇත උත්ශ්‍රේණි කිරීම, ස්තූතියි.
ඇඩම්

12

ඔබ යටි ඉරි ලකුණු භාවිතා කරයි යැයි උපකල්පනය කිරීමෙන් පේළි දෙකකින් අහඹු ලෙස නූල් උත්පාදනය කළ හැකිය:

var possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
var random = _.sample(possible, 5).join('');

6
මෙමඟින් ආපසු ලබා දුන් අගයට සියලු අද්විතීය අක්ෂර ඇත. එසේම, නූල් වල දිග var හි දිග දක්වා සීමා වේ.
යෙෆු

11
const c = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
const s = [...Array(5)].map(_ => c[~~(Math.random()*c.length)]).join('')

සරල, පිරිසිදු විසඳුමක්
මාර්ක් ස්වර්ඩ්ස්ට්‍රෝම්

මෙය විශාල +1 ලැබීමට සුදුසුයි
වලීඩ් අම්මාර්

වාව්! මම අවුරුදු 10+ ක් තිස්සේ js කේත කරන අතර ~~උපක්‍රමය ගැන දැන සිටියේ නැත ! හොඳයි!
පයි 6 කේ

10

වේගවත් හා වැඩිදියුණු කළ ඇල්ගොරිතම. නිල ඇඳුම සහතික නොකරයි (අදහස් බලන්න).

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;
}

2
විශිෂ්ට පිළිතුර, නමුත් සම්භාවිතාව ඒකාකාරී නොවේ. හැකි අක්ෂර 62 ක් ඇති අතර crypto.getRandomValuesඅද්විතීය අගයන් 256 න් එකක් ලබා දෙයි. 256 62 න් බෙදී නැති නිසා, ඔබ අවසන් වන්නේ AH අක්ෂර ලබා ගැනීමේ තරමක් ඉහළ සම්භාවිතාවක් ඇතිවය. මම හිතන්නේ හොඳම විසඳුම වන්නේ යූ ටියුබ් කළ දේ කිරීමයි, තවද අක්ෂර 2 ට (සමහර විට -සහ _) අක්ෂර කට්ටලයට එක් කරන්න. කෙසේ වෙතත්, නියම වැඩක් - මෙම පිළිතුරට තවත් බොහෝ ආදරය අවශ්‍යයි :)
TeWu

එකතු කිරීම - සහ _ හොඳ අදහසක් වන බැවින් එය ඔබට සම්පූර්ණ url-safe base64 කට්ටලය ලබා දෙනු ඇත
cowbert

9

එක් ලයිනර්:

Array(15).fill(null).map(() => Math.random().toString(36).substr(2)).join('')
// Outputs: 0h61cbpw96y83qtnunwme5lxk1i70a6o5r5lckfcyh1dl9fffydcfxddd69ada9tu9jvqdx864xj1ul3wtfztmh2oz2vs3mv6ej0fe58ho1cftkjcuyl2lfkmxlwua83ibotxqc4guyuvrvtf60naob26t6swzpil

එය කෙටි Array(15)අගයකට කුඩා අගයකට වෙනස් කිරීම. උදා: Array(4).
ඇන්ඩෲ

මම සරල හා පැහැදිලි මෙම විසඳුමට කැමතියි. එය 0 සහ 1 අතර අහඹු සංඛ්‍යා 15 ක් ජනනය කරයි, ෂඩාස්රාකාරය ජනනය කරයි, ඉන්පසු පළමු අක්ෂර දෙක ඉවත් කරන්න. අවසාන වශයෙන් එය ඔවුන් සියල්ලන්ම ඒකාබද්ධ කිරීමයි.
සිසියා

8

"මට අහඹු නූල් අවශ්‍යයි" ප්‍රශ්න වලට ප්‍රතිචාර දැක්වීමේ ගැටළුව (ඕනෑම භාෂාවකින්) ප්‍රායෝගිකව සෑම විසඳුමක්ම නූල් දිගෙහි දෝෂ සහිත ප්‍රාථමික පිරිවිතරයක් භාවිතා කරයි . අහඹු නූල් අවශ්‍ය වන්නේ මන්දැයි ප්‍රශ්න විසින්ම හෙළි කරන්නේ කලාතුරකිනි, නමුත් මම ඔබට අභියෝග කරන්නේ කලාතුරකින් අහඹු ලෙස දිග අවශ්‍ය වන බව පවසන්න. 8 ඔබට නොකඩවා අවශ්‍ය වන්නේ අද්විතීය නූල් කිහිපයක් , උදාහරණයක් ලෙස, සමහර සඳහා හඳුන්වන ලෙස භාවිතා කිරීමට.

තදින් අද්විතීය නූල් ලබා ගැනීම සඳහා ප්‍රමුඛ ක්‍රම දෙකක් තිබේ : නිර්ණායක වශයෙන් (එය අහඹු නොවේ) සහ ගබඩා කිරීම / සංසන්දනය කිරීම (එය බරයි). අපි මොකද කරන්නේ? අපි අවතාරය අත්හරින්නෙමු. අපි ඒ වෙනුවට සම්භාවිතා සුවිශේෂත්වය සමඟ යමු . එනම්, අපගේ නූල් අද්විතීය නොවන බවට යම් (කෙසේ වෙතත් කුඩා) අවදානමක් ඇති බව අපි පිළිගනිමු. Ision ට්ටන සම්භාවිතාව සහ එන්ට්‍රොපිය අවබෝධ කර ගැනීම මෙහිදීය ප්‍රයෝජනවත් .

එබැවින් නැවත නැවත කිරීමේ කුඩා අවදානමක් ඇති නූල් කිහිපයක් අවශ්‍ය බැවින් වෙනස් කළ නොහැකි අවශ්‍යතාව මම නැවත ලියමි. සංයුක්ත උදාහරණයක් ලෙස, ඔබට හැඳුනුම්පත් මිලියන 5 ක විභවයක් ජනනය කිරීමට අවශ්‍ය යැයි කියමු. සෑම නව නූලක්ම ගබඩා කර සංසන්දනය කිරීමට ඔබට අවශ්‍ය නැති අතර ඒවා අහඹු ලෙස වීමට ඔබට අවශ්‍යය, එබැවින් ඔබ නැවත නැවත වීමේ අවදානමක් පිළිගනී. උදාහරණයක් ලෙස, නැවත කියවීමේ අවස්ථාව ට්‍රිලියන 1 ට 1 ට වඩා අඩු අවදානමක් යැයි කියමු. ඉතින් ඔබට අවශ්‍ය නූල් දිග කුමක්ද? හොඳයි, එම ප්‍රශ්නය අවතක්සේරු කර ඇත්තේ එය භාවිතා කරන අක්ෂර මත රඳා පවතින බැවිනි. නමුත් වඩා වැදගත් දෙය නම් එය නොමඟ යවන සුළුය. ඔබට අවශ්‍ය වන්නේ නූල් වල එන්ට්‍රොපියෙහි පිරිවිතරයක් මිස ඒවායේ දිග නොවේ. එන්ට්‍රොපිය කෙඳි ගණනාවක පුනරාවර්තනයේ සම්භාවිතාව සමඟ කෙලින්ම සම්බන්ධ විය හැකිය. නූල් දිගට බැහැ.

එන්ට්‍රොපි ස්ට්‍රිං වැනි පුස්තකාලයකට උදව් කළ හැකි ස්ථානය මෙයයි. ට්‍රිලියන 1 ට වඩා අඩු අහඹු හැඳුනුම්පත් උත්පාදනය කිරීම සඳහා නූල් මිලියන 5 කින් පුනරාවර්තනය වීමට 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"

භාවිතා කරන ලද අක්ෂර කට්ටලයේ මුළු අක්ෂර ගණනෙහි වෙනස හේතුවෙන් නූල් දිගෙහි වෙනස සැලකිල්ලට ගන්න. නිශ්චිත විභව නූල් ගණන පුනරාවර්තනය වීමේ අවදානම සමාන වේ. නූල් දිග නොවේ. සියල්ලටම වඩා, පුනරාවර්තනයේ අවදානම සහ විභව නූල් ගණන පැහැදිලිය. නූල් දිග සමඟ තවත් අනුමාන කිරීමක් නැත.


7
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: - /
xanderiel

3
මා වෙනුවෙන් එය නිවැරදි --strLengthකිරීමට මාරු වීම strLength--.
xanderiel

7

ඔබට අයිතම රාශියක් හරහා ලූප් කර ඒවා විචල්‍ය විචල්‍යයකට පුනරාවර්තනය කළ හැකිය, උදාහරණයක් ලෙස ඔබට අහඹු ඩීඑන්ඒ අනුක්‍රමයක් අවශ්‍ය නම්:

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));


6

මේ වගේ දෙයක් ගැන කොහොමද: Date.now().toString(36) අහඹු ලෙස නොවේ, නමුත් ඔබ එය අමතන සෑම අවස්ථාවකම කෙටි හා සුවිශේෂී වේ.


1
අවාසනාවට මෙය අද්විතීය නොවනු ඇත, Date.now()මිලි තත්පර විභේදන පමණක් ඇත. සරල පුඩුවක් තුළ ධාවනය වන විට, උදාහරණයක් ලෙස, ඔබට අනුපිටපත් රාශියක් ලැබෙනු ඇත. for (let i = 0; i < 10; ++i) { console.log(Date.now().toString(36)); }.
Nate

6

කුඩා අකුරු සහ ලොකු අකුරු සඳහා සහය දැක්වීම සඳහා පිරිසිදු විසඳුමක් මට හමු නොවීය.

සිම්පල් පමණක් සහාය:

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('');

ඔබට අවශ්‍ය දිගට හැඩගැසීමට 5in වෙනස් කරන්න substr(2, 5).


5

මෙය නිසැකවම ක්රියා කරයි

<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>

5

මෙම සංයුක්ත කුඩා උපක්‍රමය ගැන කුමක් කිව හැකිද?

var possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
var stringLength = 5;

function pickRandom() {
    return possible[Math.floor(Math.random() * possible.length)];
}

var randomString = Array.apply(null, Array(stringLength)).map(pickRandom).join('');

Array.applyහිස් අරාව නිර්වචනය නොකළ පෙළක් බවට පත් කිරීමට ඔබට එහි අවශ්‍ය වේ.

ඔබ ES2015 සඳහා කේත කරන්නේ නම්, අරාව තැනීම ටිකක් සරල ය:

var randomString = Array.from({ length: stringLength }, pickRandom).join('');

5

සිද්ධි සංවේදී අක්ෂරාංක අක්ෂර:

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පිළිගත් පිළිතුරට සමාන දෙයක් එකතු කළ හැකි නම් එය සිසිල් වනු ඇත , එබැවින් ශ්‍රිතයේ ප්‍රති come ල වඩාත් වින්‍යාසගත කළ හැකිය.
ඩෙනිස්.සබොලොට්නි

5

මෙන්න මගේ ප්‍රවේශය (ටයිප්ස්ක්‍රිප්ට් සමඟ).

නවීන js සහ පිරිසිදු කේත භාවිතා කරමින් සරල විසඳුමක් මා නොදකින නිසා තවත් ප්‍රතිචාරයක් ලිවීමට මම තීරණය කර ඇත්තෙමි.

const DEFAULT_ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';

function getRandomCharFromAlphabet(alphabet: string): string {
  return alphabet.charAt(Math.floor(Math.random() * alphabet.length));
}

function generateId(idDesiredLength: number, alphabet = DEFAULT_ALPHABET): string {
  /**
   * Create n-long array and map it to random chars from given alphabet.
   * Then join individual chars as string
   */
  return Array.from({length: idDesiredLength}).map(() => {
    return getRandomCharFromAlphabet(alphabet);
  }).join('');
}

generateId(5); // jNVv7
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.