জাভাস্ক্রিপ্টে এলোমেলো স্ট্রিং / অক্ষর তৈরি করুন


1776

আমি সেট থেকে এলোমেলোভাবে বাছাই করা অক্ষরের সমন্বয়ে গঠিত 5 টি অক্ষরের স্ট্রিং চাই [a-zA-Z0-9]

জাভাস্ক্রিপ্ট দিয়ে এটি করার সর্বোত্তম উপায় কি?


48
সতর্কতা: উত্তরের কোনও true-randomফলাফলই নেই! তারা কেবল pseudo-random। সুরক্ষা বা সুরক্ষার জন্য এলোমেলো স্ট্রিং ব্যবহার করার সময়, এগুলির কোনও ব্যবহার করবেন না !!! এপিআইয়ের একটিটির
রন ভ্যান ডের

48
ম্যাথ.রেন্ডম ()। টু স্ট্রিং (36)। রিপ্লেস (/ [^ এজে] + / জি, '')
মুয়াজ খান

13
সমাধান একটি সমাধান রাখুন দয়া করে।
24:36

214
Math.random().toString(36).replace(/[^a-z]+/g, '').substr(0, 5);
ফ্রিডরিচ

উত্তর:


2430

আমি মনে করি এটি আপনার পক্ষে কাজ করবে:

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) আচরণ করে behavior আপনি যদি দীর্ঘতর স্ট্রিং তৈরি করতে চান, আপনার পৃথক অক্ষরের একটি অ্যারে তৈরি করা উচিত এবং শেষে তাদের একসাথে যোগদান করা উচিত।
ড্যান_ওয়াটারওয়ার্থ

97
@ উদ্যান_ ওয়াটারওয়ার্থ সম্ভবত এটি প্রায় কোনও ক্ষেত্রেই কিছু যায় আসে না : কোডিংহরর.com
অ্যালেক্স রিস

7
@ উদ্যান_ওয়াটারওয়ার্থ, আসলে, +=প্রায়শই কোনও কারণে দ্রুত হয়, এমনকি লুপগুলির অভ্যন্তরে ব্যবহৃত হয় - jsperf.com/join-vs- সংবিধান
কনরাড বোরোস্কি

18
@ জোনাথনপলসন আমাকে নম্বরগুলি দেখান । পূর্ববর্তী মন্তব্যটি একটি জেএসপিআফ লিংক বা jsperf.com/sad-tragedy-of-microoptimization বা sitepen.com/blog/2008/05/09/string-performance-an-analysis ইত্যাদি সহ পূর্ববর্তী মন্তব্যটি দেখুন, এছাড়াও এই প্রশ্নটিতে কেবল 5 টি যুক্তি যুক্ত রয়েছে
অ্যালেক্স রিস

11
@ কোডনামজেমস দয়া করে আপনার পাসওয়ার্ড সল্টিং এ ব্যবহার করবেন না । এটি কেবল ছদ্ম-এলোমেলো সুরক্ষিত নয়। ধরে নেওয়া যাক আপনি নোড ব্যবহার করছেন (আমি ক্লায়েন্টের দিকে স্যাল্ট দিচ্ছি তবে কোথায় শুরু করব তাও নিশ্চিত নই), cryptoপরিবর্তে ব্যবহার করুন।
হাইড্রোথার্মাল

2330

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

দ্রষ্টব্য: উপরের অ্যালগরিদমে নিম্নলিখিত দুর্বলতা রয়েছে:

  • ভাসমান পয়েন্টগুলি স্ট্রাইফিং করার সময় পেছনের শূন্যগুলি মুছে ফেলার কারণে এটি 0 থেকে 6 টি অক্ষরের মধ্যে যে কোনও জায়গায় উত্পন্ন করবে।
  • এটি ভাসমান পয়েন্ট সংখ্যাগুলিকে শক্তিশালী করতে ব্যবহৃত অ্যালগরিদমের উপর গভীরভাবে নির্ভর করে, যা ভয়াবহভাবে জটিল। ( "ভাসমান-পয়েন্ট নম্বর সঠিকভাবে কীভাবে প্রিন্ট করা যায়" কাগজটি দেখুন ))
  • Math.random()বাস্তবায়নের উপর নির্ভর করে অনুমানযোগ্য ("এলোমেলো চেহারা" তবে সত্যই এলোমেলো নয়) আউটপুট উত্পাদন করতে পারে। ফলস্বরূপ স্ট্রিং উপযুক্ত নয় যখন আপনার স্বতন্ত্রতা বা অনিশ্চয়তার গ্যারান্টি দেওয়া দরকার।
  • এমনকি যদি এটি 6 টি অভিন্ন র্যান্ডম, অনির্দেশ্য অক্ষর তৈরি করে থাকে তবে জন্মদিনের প্যারাডক্সের কারণে আপনি কেবল প্রায় 50,000 স্ট্রিং উত্পন্ন করার পরে একটি নকল দেখতে আশা করতে পারেন । (স্কয়ার্ট (36 ^ 6) = 46656)

276
Math.random().toString(36).substr(2, 5), কারণ .substring(7)এটি 5 টি অক্ষরের চেয়ে দীর্ঘ হয়। পুরো পয়েন্ট, এখনও!
ড্রাগন

81
@ স্কুপ toStringজাভাস্ক্রিপ্টে একটি সংখ্যা টাইপের পদ্ধতিতে নম্বরটিকে একটি বেসকে রূপান্তর করতে একটি optionচ্ছিক প্যারামিটার লাগে। উদাহরণস্বরূপ, আপনি যদি দুটি পাস করেন তবে আপনি বাইনারিটিতে আপনার সংখ্যা উপস্থাপন করবেন। হেক্স (বেস 16) এর অনুরূপ, বেস 36 অক্ষরের প্রতিনিধিত্ব করতে 9 টিরও বেশি সংখ্যা উপস্থাপন করতে অক্ষর ব্যবহার করে একটি এলোমেলো সংখ্যাটিকে বেস 36 এ রূপান্তর করে, আপনি আপাতদৃষ্টিতে এলোমেলো অক্ষর এবং সংখ্যার একগুচ্ছ দিয়ে সজ্জিত হবেন।
ক্রিস বেকার

76
দেখতে সুন্দর দেখাচ্ছে তবে কয়েকটি ক্ষেত্রে এটি খালি স্ট্রিং উত্পন্ন করে! যদি এলোমেলোভাবে 0, 0.5, 0.25, 0.125 দেয় ... খালি বা সংক্ষিপ্ত স্ট্রিংয়ের ফলাফল হবে।
জার্মটাস

67
@ জার্তাস এটিকে এড়াতে পারবেন(Math.random() + 1).toString(36).substring(7);
জর্জ রিথ

84
ছেলে, এটি কার্যত অকেজো। এটি মাত্র 1000000 বার চালান এবং আপনি সাধারণত প্রায় 110000 পুনরাবৃত্তি ঘটনাসমূহ পান: বিভিন্ন মান = {}, i = 0, সদৃশকাউন্ট = 0, ভাল; যখন (আমি <1000000) {ভাল = ম্যাথ.আরন্ডম ()। টুস্ট্রিং (36) .সুবস্ট্রিং (7); যদি (মানগুলি [ভাল]) uplic সদৃশ ++; } মানগুলি [ভাল] = 1; আমি ++,; so কনসোল.লগ ("মোট ডুপ্লিকেটস", সদৃশ)
হ্যাকলিক্যাক্র্যাক 15

462

ম্যাথ.র্যান্ডম এই ধরণের জিনিসটির জন্য খারাপ

বিকল্প 1

আপনি যদি এই সার্ভারের পাশাপাশি করতে সক্ষম হন তবে কেবল ক্রিপ্টো মডিউলটি ব্যবহার করুন -

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

// "bb5dc8842ca31d4603d6aa11448d1654"

ফলস্বরূপ স্ট্রিংটি আপনার এলোমেলো বাইটগুলি দ্বিগুণ হবে; হেক্সে এনকোড করা প্রতিটি বাইট 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 ('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 ]

আইই 11 সমর্থনের জন্য আপনি ব্যবহার করতে পারেন -

(window.crypto || window.msCrypto).getRandomValues(arr)

ব্রাউজারের কভারেজের জন্য https://caniuse.com/#feat=getrandomvalues ​​দেখুন


4
যথাযথভাবে। কোনও ইউআইডি কোনও জিনিসকে আইডি নির্ধারণের জন্য সূক্ষ্ম হলেও, এলোমেলো অক্ষরের একটি স্ট্রিং হিসাবে এটিকে ব্যবহার করা (এবং সম্ভবত অন্যান্য) কারণে এটি দুর্দান্ত ধারণা নয়।
wmassingham

2
.map()অপশন 3. এর জন্য কোনও প্রয়োজন নেই Array.from(arr, dec2hex).join('')= === Array.from(arr).map(dec2hex).join('')। আমাকে এই বৈশিষ্ট্যগুলির সাথে পরিচয় করিয়ে দেওয়ার জন্য ধন্যবাদ :-)
ফ্রেড গ্যান্ট

6
উত্তরে আপনার উল্লেখ করা উচিত যে বিকল্প 2 এর জন্য কাজ করার জন্য নোড.জেও প্রয়োজন, এটি খাঁটি জাভাস্ক্রিপ্ট নয়।
ইসকো

5
আরও ক্রিপ্টোগ্রাফিকভাবে সুরক্ষিত থাকার সময় এটি আসলে প্রশ্নের প্রয়োজনীয়তা পূরণ করে না কারণ এটি কেবল 0-9 এবং আফটার (হেক্সাডেসিমাল) আউটপুট করে এবং 0-9, এজেড, এজেড নয়।
qJake

1
requireমডিউলটি কি কেবল সার্ভার-সাইড ব্যবহার করতে সক্ষম নয় ?
এজেটহর্ন

173

সংক্ষিপ্ত, সহজ এবং বিশ্বাসযোগ্য

এখানে পাওয়া শীর্ষ রেটেড উত্তরগুলির বিপরীতে ঠিক 5 টি এলোমেলো অক্ষর প্রদান করে।

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

9
Math.random().toString(36)5 টিরও কম অক্ষরের সাথে যদি কোনও সংখ্যা ফেরত দেয় তবে কী হবে ?
মাইকেল লিটভিন

3
ঠিক আছে, এটি @ অপেরু-র একটি আকর্ষণীয় অভিযোগ, আমি বলছি না যে আমি সমাধানটি আবিষ্কার করেছিলাম কিন্তু আমি বছরের পর বছর ধরে এটি আমার প্রকল্পগুলিতে ব্যবহার করছি। এবং আপনার উল্লিখিত মন্তব্যের সাথে এর কোনও যোগসূত্র নেই। এবং আমি পুরোপুরি নিশ্চিত যে এসও-তে গুরুত্বপূর্ণ বিষয়টি সঠিক জায়গায় সবচেয়ে দরকারী তথ্য এবং এমনকি এটি অন্য কোনও জায়গায় ইতিমধ্যে উপস্থিত থাকলেও। ভাগ্যক্রমে, মনে হচ্ছে কমপক্ষে 51 জন এই উত্তরটি দরকারী বলে খুঁজে পেয়েছেন, আপনাকে স্বাগতম!
সিলভার রিঙ্গভী 11

3
ম্যাথ.র্যান্ডম () এর ক্ষেত্রে খালি স্ট্রিং এড়ানোর জন্য আপনি 0 টি ব্যবহার করতে পারেনfunction getRandomString() { var result = ''; while (!result) result = Math.random().toString(36).substring(2); return result; };
মাইকেপ

5
@ রিনোগো ম্যাথ.র্যান্ডম () ১ টি বিকাশকারী
মাইকেপ

6
আমি এই কোডটি 1,000,000,000 বার চালিয়েছি এবং এখনও খালি স্ট্রিংটি পাইনি: jsfiddle.net/mtp5730r আমি বলব যে আপনি খালি স্ট্রিং পাওয়া থেকে বেশ নিরাপদ।
ম্যাক্রোমান

157

এখানে একটি উন্নতি এর doubletap এর চমৎকার উত্তর । মূলটির দুটি ঘাটতি রয়েছে যা এখানে সম্বোধন করা হয়েছে:

প্রথমত, অন্যরা যেমন উল্লেখ করেছে, এতে ছোট স্ট্রিং তৈরির এমনকি একটি খালি স্ট্রিং তৈরির সম্ভাবনা রয়েছে (যদি এলোমেলো সংখ্যাটি 0 হয়) যা আপনার অ্যাপ্লিকেশনটি ভেঙে দিতে পারে। এখানে একটি সমাধান:

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

দ্বিতীয়ত, উপরের মূল এবং সমাধান উভয়ই স্ট্রিংয়ের আকার N এর মধ্যে 16 টি অক্ষর সীমাবদ্ধ করে। নিম্নলিখিত যে কোনও এন এর আকার N এর স্ট্রিং ফিরিয়ে দেবে (তবে নোট করুন যে এন> 16 ব্যবহার করে এলোমেলোতা বাড়বে না বা সংঘর্ষের সম্ভাবনা হ্রাস পাবে না):

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

ব্যাখ্যা:

  1. [0,1) ব্যাপ্তিতে একটি এলোমেলো সংখ্যা বেছে নিন, অর্থাৎ 0 (সহ) এবং 1 (একচেটিয়া) এর মধ্যে।
  2. সংখ্যাটি বেস -৩ string স্ট্রিংয়ে রূপান্তর করুন, অর্থাত্ ০-৯ এবং এজে ব্যবহার করুন।
  3. জিরোসের সাথে প্যাড (প্রথম সংখ্যাটি সমাধান করে)।
  4. শীর্ষস্থানীয় '0.' কেটে টুকরো টুকরো করুন উপসর্গ এবং অতিরিক্ত প্যাডিং শূন্য।
  5. এতে কমপক্ষে এন অক্ষর থাকার জন্য স্ট্রিংটি পর্যাপ্ত সময় পুনরাবৃত্তি করুন (ডিলিমিটার হিসাবে ব্যবহৃত ছোট র্যান্ডম স্ট্রিংয়ের সাথে খালি স্ট্রিংগুলিতে যোগ দিয়ে)।
  6. স্ট্রিং থেকে ঠিক এন অক্ষর টুকরো টুকরো।

আরও চিন্তা:

  • এই সমাধানটি বড় হাতের অক্ষর ব্যবহার করে না, তবে প্রায় সব ক্ষেত্রেই (কোনও পাং উদ্দেশ্য নয়) এটি কোনও বিষয় নয়।
  • মূল উত্তরের N = 16 এ সর্বাধিক স্ট্রিংয়ের দৈর্ঘ্য ক্রোমে মাপা হয়। ফায়ারফক্সে এটি এন = ১১। তবে যেমন ব্যাখ্যা করা হয়েছে, দ্বিতীয় সমাধানটি কোনও অনুরোধিত স্ট্রিং দৈর্ঘ্যের সমর্থন সম্পর্কে, এলোমেলো যোগ করার বিষয়ে নয়, সুতরাং এটি খুব বেশি পার্থক্য করে না।
  • সমস্ত ফিরে আসা স্ট্রিংগুলির ফিরে আসার সমান সম্ভাবনা রয়েছে, কমপক্ষে যতদূর পর্যন্ত ম্যাথ.র্যান্ডম () দ্বারা প্রাপ্ত ফলাফলগুলি সমানভাবে বিতরণ করা হয়েছে (এটি কোনও অবস্থাতেই ক্রিপ্টোগ্রাফিক-শক্তি র্যান্ডমনেস নয়)।
  • আকারের সমস্ত সম্ভাব্য স্ট্রিং N ফেরত দেওয়া যাবে না। দ্বিতীয় সমাধানে এটি সুস্পষ্ট (যেহেতু ছোট স্ট্রিংটি কেবল নকল করা হচ্ছে), তবে মূল উত্তরে এটিও সত্য কারণ বেস -৩ to এ রূপান্তর করার পরে শেষ কয়েকটি বিট মূল র্যান্ডম বিটের অংশ নাও হতে পারে। বিশেষত, আপনি যদি ম্যাথআরন্ডম ()। টুস্ট্রিং (36) এর ফলাফলের দিকে লক্ষ্য করেন তবে আপনি লক্ষ্য করবেন যে শেষ চরিত্রটি সমানভাবে বিতরণ করা হয়নি। আবার প্রায় সব ক্ষেত্রেই এটির কিছু আসে যায় না, তবে আমরা এলোমেলো স্ট্রিংয়ের শেষের চেয়ে শুরু থেকেই চূড়ান্ত স্ট্রিংটি টুকরো করি যাতে সংক্ষিপ্ত স্ট্রিংগুলি (যেমন এন = 1) প্রভাবিত না হয়।

হালনাগাদ:

আমি এখানে এসেছি এমন কয়েকজন অন্যান্য কার্যকরী শৈলীর একটি-লাইনার। তারা এর উপরের সমাধান থেকে পৃথক:

  • তারা একটি সুস্পষ্ট যথেচ্ছ বর্ণমালা ব্যবহার করে (আরও জেনেরিক এবং মূল প্রশ্নের সাথে উপযুক্ত যা উভয় ক্ষেত্রে বড় এবং ছোট হাতের অক্ষরই চেয়েছিল)।
  • দৈর্ঘ্যের 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('');

সম্পাদনা:

আমি কোবাইট এবং মার্টিজন ডি মিলিয়ানোর মতো মনে হচ্ছে (কুডোস!) এর মতো সমাধান নিয়ে এসেছিল যা আমি একরকম মিস করেছি। যেহেতু তারা এক নজরে ততটা ছোট দেখায় না, তাই যদি কেউ সত্যিই ওয়ান-লাইনার চায় তবে আমি এটি এখানে ছেড়ে দেব :-)

এছাড়াও, আরও কয়েকটি বাইট শেভ করার জন্য সমস্ত দ্রবণগুলিতে 'অ্যারে' দিয়ে 'নতুন অ্যারে' প্রতিস্থাপন করা হয়েছে।


কেন শুধু 1 যুক্ত করবেন না? (Math.random()+1).toString(36).substring(7);
এমিক্স

কারণ 1 যুক্ত করা এখানে আলোচিত দুটি সমস্যার কোনওটিরই সমাধান করে না। উদাহরণস্বরূপ, (1) .toString (36)। সাবস্ট্রিং (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('')
মুহাম্মদ উমার

এটি দুর্দান্ত, তবে ফায়ারফক্সে যখন এন = 16 দিয়ে মৃত্যুদন্ড কার্যকর করা হয়েছিল তখন শেষ ~ 6 ডিজিটটি শূন্য হয়ে যায় ... (তবে এটি 5 টি এলোমেলো অক্ষরের জন্য অপের ইচ্ছা পূরণ করে না))
এডওয়ার্ড নেওল

126

সবচেয়ে কমপ্যাক্ট সমাধান, কারণ এর 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.5করলে ফলাফল হয় "0.i"। অন্যান্য প্রান্তের মামলা আছে কিনা তা নিশ্চিত নয়। কেবল এটি চিহ্নিত করতে চেয়েছিলেন যে এটি প্রশ্নের সঠিক উত্তর নয় ([a-zA-Z0-9] এর 5 টি অক্ষর)।
এক্সরে রে

2
@ এক্স-রে, আমি এটি বলব না যে এটি সঠিক উত্তর, আমি কেবল বলছি যে এটি উপরের @ ডাবলতাট্যাপ উত্তরের একটি কমপ্যাক্ট সংস্করণ। আমি ব্যক্তিগতভাবে (+new Date + Math.random())এই মামলাটি রোধ করতে ব্যবহার করি । যাইহোক, নোটের জন্য ধন্যবাদ।
ভ্যালেন্টিন পোডকামেনেনি

1
এই. আমি জানিনা কেন অন্যান্য উত্তরগুলিতে এত কোড দরকার
জন কোটজিক

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

উদাহরণের একটি বৈকল্পিক এখানে পাওয়া যাবে: mediacolleg.com/internet/javascript/number/random.html
ডেভিড

1
পাশাপাশি কেবল lenএকটি whileলুপে হ্রাস পেতে পারে
ড্রাজস

ধন্যবাদ, আমি এই উদাহরণের একটি কফিসিপক্রিপ্ট পরিবর্তনের নীচে পোস্ট করেছি: stackoverflow.com/a/26682781/262379
ডেনিস ক্রুজ

এগুলি যদি প্রকাশ্যে ব্যবহার করা হয় তবে আপনার সম্ভবত স্বরগুলি সরানো উচিত। কিছুটা কম এনট্রপি, তবে আপনি নিরাপদে এমন কোনও শব্দ তৈরি করতে পারবেন না যা অনেক বেশি নিরাপদ। সে কারণেই আমি এটি পছন্দ করি, যেহেতু আমি আমার নিজস্ব চরিত্রের স্ট্রিংটি প্রেরণ করতে পারি। ভাল করেছ.
নাট বুনি

খুব সুন্দর, আমার জন্য কাজ করেছেন, ধন্যবাদ!
জাকী মোহাম্মদ

73

এস 6 স্প্রেড অপারেটর সহ একটি নতুন সংস্করণ :

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

  • 30অবাধ নম্বর, যদি আপনি কোন টোকেন দৈর্ঘ্য যদি আপনি চান বাছাই করতে পারেন
  • 36সর্বাধিক র্যাডিক্স সংখ্যা আপনাকে প্রেরণ করতে পারেন numeric.toString () , যার মানে সব সংখ্যা এবং AZ ছোট হাতের অক্ষর
  • 2র্যান্ডম স্ট্রিং ভালো দেখায় যা থেকে 3 বিন্দু সূচক বাছাই ব্যবহার করা হয়: "0.mfbiohx64i"আমরা পরে সূচক গ্রহণ করতে পারে0.

আপনি ব্যাখ্যা করতে পারেন? বিশেষত কেন আপনি টুস্ট্রিং () এ 36 পাস করেন এবং আপনি তৃতীয় উপাদানটি কেন বেছে নিন?
vuza

5
এটিই সেরা সমাধান
পরাস্ত করুন

চমৎকার, তবে এই সমাধানটিতে [এজেড] অক্ষরগুলি প্রশ্নের অনুরোধ হিসাবে অন্তর্ভুক্ত নয়, কেবল [a-z0-9]
নাহুয়েল গ্রিকো

71

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

3
এছাড়াও while(L--)এটা করতে হবে
VSync

1
'A'.charCodeAt(0)যাদু সংখ্যার চেয়ে আরও শক্তিশালী ব্যবহার করা ভাল 55(এবং একইভাবে এর জন্য 61)। বিশেষত যেহেতু, আমার প্ল্যাটফর্মে যাইহোক, যে ম্যাজিক নম্বরটি ফিরে আসে 65। সেই কোডটি স্ব-নথির পাশাপাশি আরও ভাল হবে।
গ্রামড্রিগ

: আমি এখানে একটি minification অপ্টিমাইজ (46 ছোট বাইট) আপনার প্রয়োগের বৈকল্পিক নির্মিত stackoverflow.com/a/52412162
Waruyama

শুভকামনা যে কখনও এই বারুয়ামাকে ডিবাগ করে। ওয়েবপ্যাকটি কী!
ডিলান ওয়াটসন

60

এলোমেলো স্ট্রিং জেনারেটর (আলফা-সংখ্যাসূচক | আলফা | সংখ্যাযুক্ত)

/**
 * 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 আউটপুটটির জন্য অতিরিক্ত চেকগুলি ব্যবহার করার সময় , আরও ভাল বোঝার জন্য আসুন এটি প্রয়োজনীয়তা (কেবলমাত্র আলফা-নিউমেরিক) কেটে ফেলুন:

  • একটি আর্গুমেন্ট গ্রহণ করে এমন একটি ফাংশন তৈরি করুন (এলোমেলো স্ট্রিং ফলাফলের পছন্দসই দৈর্ঘ্য)
  • var str = "";এলোমেলো অক্ষর যুক্ত করতে একটি খালি স্ট্রিং তৈরি করুন
  • একটি লুপের ভিতরে 0 থেকে 61 (0..9 + এ..জেড + এ..জেড = 62) পর্যন্ত একটি randসূচক নম্বর তৈরি করুন
  • সামঞ্জস্য / সংশোধন করার জন্য একটি শর্তযুক্ত লজিক তৈরি করুন (যেহেতু এটি 0..61) কিছু সংখ্যক দ্বারা এটি বৃদ্ধি করে (নীচের উদাহরণগুলি দেখুন) সঠিক নম্বর এবং সম্পর্কিত চরিত্রটি ফিরে পেতে ।randCharCode
  • লুপের অভ্যন্তরে strString.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))


33

সবচেয়ে সহজ উপায়:

(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)
সিনিয়রপ্রেচার

আমি আপনার এলোমেলো সংখ্যার সমাধানটি পছন্দ করি তবে 9e6 5.4 অঙ্কের (60 ^ 5) এর জন্য 60.4 মিলিয়ন লোকের চেয়ে 9 মিলিয়ন সম্ভাবনা দেয় যাতে আপনি এটি (0|Math.random()*6.04e7).toString(36)কভার করার জন্য এটি প্রতিস্থাপন করতে পারেন।
লে ড্রড

1
আমি একটি সংক্ষিপ্ত-সম্ভাব্য রুটিন (একটি কোড ডেমোর জন্য) সহ একটি দীর্ঘতর এলোমেলো স্ট্রিং চেয়েছিলাম যা ক্রিপ্টোগ্রাফিকভাবে আশ্চর্যজনক হওয়ার দরকার নেই, কেবল কিছু দুর্দান্ত এলোমেলো ভিজ্যুয়াল "ফ্লাফ" তৈরি করতে চাই। আমি এই উত্তরটি সেরা (আপনার দ্বিতীয়) টি পছন্দ করি, তাই আপনাকে ধন্যবাদ। আমার দুই সেন্ট: আমি এক কম কীস্ট্রোক সঙ্গে ক্ষুদ্রতা জন্য এটি বীট করতে পারেন, এবং এটি সাধারণত (একটি নির্দিষ্ট সময়ের ছাড়া) 13 র্যান্ডম অক্ষর উত্পাদন করা হবে: (Math.random()*1e20).toString(36)
অ্যান্ড্রু উইলেস

এই উত্তরটির সাথে আমার একটি উত্তরসূত্রটি হ'ল এটি [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

আমি জানি যে সবাই ইতিমধ্যে এটি পেয়েছে, তবে আমার মনে হয়েছে যে এটি সম্ভব সবচেয়ে হালকা উপায়ে (কোডে হালকা, সিপিইউ নয়) এই দিকে একবার যেতে পারে:

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

console.log(rand(5));

আপনার মাথাটি চারদিকে মুড়িয়ে রাখতে কিছুটা সময় সময় লাগে তবে আমি মনে করি এটি জাভাস্ক্রিপ্টের বাক্য গঠনটি কতটা ভয়ঙ্কর।


20
আপনি যদি কোডটি ছোট রাখার চেষ্টা করছেন, current = current ? current : '';আপনি যখন লিখতে পারেন তখন কেন লিখবেন current = current || '';
ক্যাফগীক

9
যেহেতু আমরা এখানে মাইক্রো অপ্টিমাইজেশনের কথা বলছি আমি আসলে প্রয়োজন বোধ না করে ভেরিয়েবল অ্যাসাইনমেন্টটি পুরোপুরি বাদ দেওয়ার পরামর্শ দেব:current || (current = '');
টমাস হেইম্যান

"দুর্দান্ত" ব্যবহার করার সময় মাইক্রো অপ্টিমাইজেশনের চেষ্টা করা তবে সংস্থানসমূহের পুনরাবৃত্তির অ্যালগরিদম অপচয় করা কোনও অর্থবোধ করে না :-) জাভাস্ক্রিপ্টে লুপের জন্য এখনও সবচেয়ে ভাল এবং পুনরাবৃত্তির বড় সময়কে পিছনে ফেলেছে, যতক্ষণ না রানটাইমের অনুকূলিতকরণের কোডটিতে সত্যিকারের বড় অগ্রগতি না ঘটে।
মারে

17

আপনি ব্যবহার করে থাকেন Lodash বা আন্ডারস্কোর , তাহলে এটি এত সহজ:

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

6
লোডাশ ব্যবহার করে_.sampleSize('asdfgh',5).join('')
মার্ভেল

2
এটি আসলে কোনও ভাল সমাধান নয়, কারণ প্রতিটি ডক্স প্রতিটি অক্ষর একটি অনন্য সূচক থেকে আসে। এর অর্থ এটি সত্যিকারের এলোমেলো নয়, যেহেতু কোনও চরিত্র কখনও / পুনরাবৃত্তি করতে পারে না।
এলোমেলো_ ব্যবহারকারীর_নম

16

প্রয়োজনীয়তা মেটাতে [a-zA-Z0-9] এবং দৈর্ঘ্য = 5 ব্যবহার

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

ছোট হাতের অক্ষর, বড় হাতের অক্ষর এবং সংখ্যাগুলি ঘটবে।


1
আমার ধারণা, ম্যাথআর্যান্ডম () খুব কম অক্ষর সহ বেস 64-স্ট্রিংয়ের দিকে নিয়ে যেতে পারে।
লিফ

14

যদি কেউ ওয়ান-লাইনারে আগ্রহী (যদিও আপনার সুবিধার জন্য ফর্ম্যাট করা হয়নি) যা একবারে মেমরি বরাদ্দ করে (তবে মনে রাখবেন যে ছোট স্ট্রিংগুলির জন্য এটি গুরুত্বপূর্ণ নয়) এখানে এটি কীভাবে করবেন:

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

আপনি 5যে স্ট্রিং চান তার দৈর্ঘ্য দ্বারা প্রতিস্থাপন করতে পারেন। এই পোস্টে @ আরিয়াহাইদয়াতকে ধন্যবাদ জানায় যে mapদ্বারা তৈরি স্পার্স অ্যারেটিতে কাজ না করে সমাধানের সমাধানের জন্য Array(5)


13
প্রতিটি জাভাস্ক্রিপ্ট প্রোগ্রাম হ'ল 'ওয়ান-লাইনার' যদি আপনি এটির মতো ফর্ম্যাট করেন
হ্যাকলিক্যাক্র্যাক

13

আমার তৈরি পদ্ধতিটি এখানে Here
এটি একটি স্ট্রিং তৈরি করবে যা বড় এবং ছোট উভয় অক্ষর সমন্বিত থাকবে।
এছাড়াও আমি ফাংশনটি অন্তর্ভুক্ত করেছি যা একটি বর্ণমালার স্ট্রিংও তৈরি করবে।

কার্যকারী উদাহরণ:
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;
}

জুলাই ২০১৫ আপগ্রেড করুন
এটি একই কাজ করে তবে আরও বুদ্ধিমান হয় এবং এতে সমস্ত অক্ষর অন্তর্ভুক্ত থাকে।

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

এই ফাংশনটির সাহায্যে আপনি কখনও 'এম' এর চেয়ে বড় হাতের অক্ষর বা 'এন' এর চেয়ে ছোট হাতের অক্ষর পাবেন না।
এরকানাইল্ডিজ

সত্যি? Ooh! সম্ভবত এটি আরও পরীক্ষা করবে। হুম, তবে এটি একটি এলোমেলো স্ট্রিং দেওয়া হয়েছে এবং এর মধ্যে কোন অক্ষর রয়েছে তা আমরা সত্যিই যত্নশীল করি না (যতক্ষণ তারা এলোমেলো থাকে) তবে এটি এখনও আমাদের যা করতে চায় তা করে যা হ্যাঁ, এটি সরবরাহ করবে আপগ্রেড, ধন্যবাদ
আদম

12

ধরে নিই যে আপনি আন্ডারস্কোর ব্যবহার করছেন কেবল দুটি লাইনে মার্জিতভাবে এলোমেলো স্ট্রিং উত্পন্ন করা সম্ভব:

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

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.getRandomValues256 টির মধ্যে একটি অনন্য মান দেয়। যেহেতু 256 62 দ্বারা বিভক্ত নয়, আপনার অক্ষর এএইচ হওয়ার কিছুটা বেশি সম্ভাবনা রয়েছে। আমি মনে করি ইউটিউব যা করেছে তা করাই সর্বোত্তম সমাধান এবং চরসেটটিতে কেবলমাত্র 2 টি অতিরিক্ত অক্ষর (সম্ভবত -এবং _) যুক্ত করা। যাইহোক, দুর্দান্ত কাজ - এই উত্তরের আরও বেশি ভালবাসার দরকার আছে :)
তেওয়ু

যোগ করা - এবং _ হ'ল একটি দুর্দান্ত ধারণা যেহেতু এটি আপনাকে সম্পূর্ণ ইউআরএল-নিরাপদ বেস 64 সেট পাবে
কাউবার্ট

8

"আমার এলোমেলো স্ট্রিং দরকার" প্রশ্নের (যে কোনও ভাষায়) প্রশ্নের প্রতিক্রিয়াগুলির সাথে সমস্যাটি কার্যত প্রতিটি সমাধান স্ট্রিং দৈর্ঘ্যের ত্রুটিযুক্ত প্রাথমিক স্পেসিফিকেশন ব্যবহার করে । প্রশ্নগুলি এলোমেলোভাবে স্ট্রিংগুলির প্রয়োজনীয়তার জন্য খুব কমই প্রকাশ করে তবে আমি আপনাকে চ্যালেঞ্জ জানাবো যে খুব কমই আপনার দৈর্ঘ্যের এলোমেলো স্ট্রিং দরকার, ৮. আপনার যা প্রয়োজন সবসময়ই অনন্য স্ট্রিংগুলির একটি সংখ্যা need , উদাহরণস্বরূপ, কোনও উদ্দেশ্যে সনাক্তকারী হিসাবে ব্যবহার করা।

কঠোরভাবে অনন্য স্ট্রিংগুলি পাওয়ার জন্য দুটি প্রধান উপায় রয়েছে : ডিটারনিস্টিকালি (যা এলোমেলো নয়) এবং স্টোর / তুলনা (যা অত্যধিক)। আমরা কি করি? আমরা ভূত ছেড়ে দিই। পরিবর্তে আমরা সম্ভাব্য স্বতন্ত্রতার সাথে যাই । এটি হ'ল আমরা স্বীকার করি যে কিছু কিছু (তবে ছোট) ঝুঁকি রয়েছে যে আমাদের স্ট্রিংগুলি অনন্য হবে না। এখানেই সংঘর্ষের সম্ভাবনা এবং এনট্রপি বোঝা যাচ্ছে সহায়ক।

সুতরাং আমি পুনরায় অল্প অল্প ঝুঁকির সাথে কয়েকটি সংখ্যক স্ট্রিংয়ের প্রয়োজন হিসাবে অদৃশ্য প্রয়োজনটিকে পুনরায় বলব। একটি দৃ concrete় উদাহরণ হিসাবে, আসুন আমরা 5 মিলিয়ন আইডি তৈরির সম্ভাবনা তৈরি করতে চাই say আপনি প্রতিটি নতুন স্ট্রিং সংরক্ষণ এবং তুলনা করতে চান না এবং আপনি এগুলি এলোমেলো হতে চান, তাই আপনি পুনরাবৃত্তি হওয়ার কিছুটা ঝুঁকি গ্রহণ করেন। উদাহরণস্বরূপ, আসুন পুনরাবৃত্তি হওয়ার ট্রিলিয়ন সম্ভাবনায় 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 টি অক্ষর সহ একটি অক্ষর সেট ব্যবহার করে uses অন্যান্য পূর্বনির্ধারিত অক্ষর সেট রয়েছে এবং আপনি নিজের অক্ষরও নির্দিষ্ট করতে পারেন। উদাহরণস্বরূপ, উপরের মতো একই এনট্রপি সহ আইডি উত্পন্ন করা কিন্তু হেক্স অক্ষর ব্যবহার করে:

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--আমার জন্য এটি সংশোধন করা হয়েছে।
xenderiel

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

ছোট হাতের এবং বড় হাতের অক্ষর উভয়কেই সমর্থন করার জন্য আমি একটি পরিষ্কার সমাধান পাইনি।

লোয়ারকেস শুধুমাত্র সমর্থন:

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)


6

এক রৈখিক:

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

এটি Array(15)একটি ছোট মান হিসাবে যুক্তি সংক্ষিপ্ত পরিবর্তন করতে । উদাহরণ: Array(4)
অ্যান্ড্রু

আমি সত্যিই সহজ এবং পরিষ্কার এই সমাধানটি পছন্দ করি। এটি 0 এবং 1 এর মধ্যে 15 এলোমেলো সংখ্যা তৈরি করছে, হেক্সাডেসিমাল উত্পন্ন করবে এবং তারপরে প্রথম দুটি অক্ষর সরিয়ে ফেলবে। অবশেষে এটি সকলকে একত্রিত করছে।
সিস্কিয়া

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

এই জাতীয় কিছুর সম্পর্কে: Date.now().toString(36) খুব এলোমেলো নয়, তবে প্রতিবার আপনি যখন কল করবেন তখন ছোট এবং বেশ অনন্য।


1
দুর্ভাগ্যক্রমে এটি অনন্য হবে না, কারণ Date.now()কেবল মিলিসেকেন্ড রেজোলিউশন রয়েছে। একটি সাধারণ লুপে চালানোর সময়, উদাহরণস্বরূপ, আপনি প্রচুর নকল পাবেন। for (let i = 0; i < 10; ++i) { console.log(Date.now().toString(36)); }
Nate

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স্বীকৃত উত্তরের মতো একটি যোগ করতে পারেন তবে এটি দুর্দান্ত হবে , সুতরাং ফাংশনের ফলাফলটি আরও কনফিগারযোগ্য।
ডেনিস.সাবোলটনি

4

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

4

আপনি কোডেরেন ব্যবহার করতে পারেন । এটি প্রদত্ত প্যাটার্ন অনুসারে এলোমেলো কোড উত্পন্ন করার জন্য একটি গ্রন্থাগার। #উপরের এবং ছোট হাতের অক্ষরের পাশাপাশি অঙ্কগুলির জন্য স্থানধারক হিসাবে ব্যবহার করুন :

var cr = new CodeRain("#####");
console.log(cr.next());

অন্য স্থানধারক যেমন Aবড় হাতের অক্ষর বা 9অঙ্কগুলির জন্য রয়েছে।

দরকারী হতে পারে যে কলিং হয় .next() সর্বদা আপনাকে একটি অনন্য ফলাফল দেয় যাতে আপনাকে নকল সম্পর্কে চিন্তা করতে হবে না।

এখানে একটি ডেমো অ্যাপ্লিকেশন যা অনন্য এলোমেলো কোডগুলির একটি তালিকা তৈরি করে

সম্পূর্ণ প্রকাশ: আমি কোডরেইনের লেখক।


কোন নম্বর নেই - নেটিভ পদ্ধতি ব্যবহার করুন।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.