जावास्क्रिप्ट सरणी से एक यादृच्छिक मान प्राप्त करना


791

विचार करें:

var myArray = ['January', 'February', 'March'];    

मैं जावास्क्रिप्ट का उपयोग करके इस सरणी से एक यादृच्छिक मान कैसे चुन सकता हूं?

जवाबों:


1478

यह एक साधारण लाइनर है

const randomElement = array[Math.floor(Math.random() * array.length)];

उदाहरण

const months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
const randomMonth = months[Math.floor(Math.random() * months.length)];

console.log("random month =>", randomMonth);


9
@ नीलमणि यह सही है। Math.floor(Math.random(...))कॉल को नोट करें, जो नीचे राउंड हो।
ashes999

32
आह, मैंने कुछ नया सीखा है। मैं उस मामले पर चर्चा कर रहा था जहां यह बिल्कुल 1 के बराबर है, लेकिन जाहिरा तौर पर (W3Schools के अनुसार) Math.random 0 समावेशी और 1 अनन्य के बीच है। मेरी गलती।
नीलमणि

13
मैं गलत हो सकता हूं, लेकिन मुझे याद है var rand = myArray[Math.random() * myArray.length>>0]कि थोड़ा तेज
vrugtehagel

6
बस के मामले में, अगर आप पहले से ही लॉश का उपयोग कर रहे हैं, तो आप _.sample (सरणी) का उपयोग कर सकते हैं
गेब्रियल

2
मैं इस प्रकार को पसंद करता हूं:var rand = myArray[Math.random() * myArray.length | 0]
निकोलस

76

यदि आप पहले से ही अंडरस्कोर या लॉश को अपने प्रोजेक्ट में शामिल कर चुके हैं, जिसका आप उपयोग कर सकते हैं _.sample

// will return one item randomly from the array
_.sample(['January', 'February', 'March']);

यदि आपको यादृच्छिक रूप से एक से अधिक आइटम प्राप्त करने की आवश्यकता है, तो आप इसे अंडरस्कोर में दूसरे तर्क के रूप में पास कर सकते हैं:

// will return two items randomly from the array using underscore
_.sample(['January', 'February', 'March'], 2);

या _.sampleSizeलॉश में विधि का उपयोग करें :

// will return two items randomly from the array using lodash
_.sampleSize(['January', 'February', 'March'], 2);

टाइपस्क्रिप्ट का उपयोग करते समय: ध्यान रखें कि वापसी प्रकार एक स्ट्रिंग सरणी दिए गए "स्ट्रिंग" के बजाय "स्ट्रिंग | अपरिभाषित" होगा।
Stephan Schielke

23

प्रोटोटाइप विधि

यदि आप एक यादृच्छिक मूल्य प्राप्त करने की योजना बना रहे हैं, तो आप इसके लिए एक फ़ंक्शन परिभाषित करना चाहते हैं।

पहले, इसे अपने कोड में कहीं रखें:

Array.prototype.sample = function(){
  return this[Math.floor(Math.random()*this.length)];
}

अभी:

[1,2,3,4].sample() //=> a random element

CC0 1.0 लाइसेंस की शर्तों के तहत सार्वजनिक डोमेन में जारी कोड ।


और यह क्या करता है?
केन शार्प

3
@KenSharp यह आपको .sample()एक यादृच्छिक आइटम प्राप्त करने के लिए किसी भी सरणी पर कॉल करने की अनुमति देता है
बेन

5
देशी वस्तु प्रकारों को बढ़ाने से बचना चाहिए। मैंने अपना उत्तर हटा दिया है, यह देखते हुए कि इसे बहुत बढ़ा दिया गया है, लेकिन बुरे अभ्यास को बढ़ावा दे रहा है। इस मुद्दे पर अधिक चर्चा के लिए देखें stackoverflow.com/questions/14034180/… और eslint.org/docs/rules/no-extend-native
Markus Amalthea Magnuson

20

~~की तुलना में बहुत तेज है Math.Floor(), इसलिए जब यूआई तत्वों का उपयोग करते हुए आउटपुट का प्रदर्शन करने की बात आती है, तो ~~गेम जीतता है। और जानकारी

var rand = myArray[~~(Math.random() * myArray.length)];

लेकिन अगर आपको पता है कि सरणी में लाखों तत्व होने वाले हैं, तो आप बिटवाइन ऑपरेटर के बीच पुनर्विचार करना चाहते हैं और Math.Floor(), जैसे कि बिटवाइज़ ऑपरेटर बड़ी संख्या के साथ अजीब व्यवहार करता है। आउटपुट के साथ समझाया गया उदाहरण नीचे देखें। और जानकारी

var number = Math.floor(14444323231.2); // => 14444323231
var number = 14444323231.2 | 0; // => 1559421343

1
लिंक मृत है, लेकिन दिलचस्प पोस्ट है और मैं इसे Math.floorअब और अधिक उपयोग करूंगा :)
aabbccsmith

"बिटवाइज़ नॉट" ऑपरेटर का उपयोग करते हुए, तेजी से, यह पठनीय नहीं है, इसलिए आपको यह चुनना होगा कि आपके लिए क्या अधिक महत्वपूर्ण है
मिकीज उरबैस्की

16

कहो कि आप एक यादृच्छिक आइटम चुनना चाहते हैं जो पिछली बार से अलग है (वास्तव में यादृच्छिक नहीं है, लेकिन अभी भी एक सामान्य आवश्यकता है) ...

@Markus द्वारा उत्तर पर निर्माण, हम एक और प्रोटोटाइप फ़ंक्शन जोड़ सकते हैं:

Array.prototype.randomDiffElement = function(last) {
   if (this.length == 0) {
      return;
   } else if (this.length == 1) {
      return this[0];
   } else {
      var num = 0;
      do {
         num = Math.floor(Math.random() * this.length);
      } while (this[num] == last);
      return this[num];
   }
}

और इस तरह लागू करें:

var myRandomDiffElement = myArray.randomDiffElement(lastRandomElement)

11

यदि आपके पास निश्चित मान हैं (जैसे एक महीने का नाम सूची) और एक-पंक्ति समाधान चाहते हैं

var result = ['January', 'February', 'March'][Math.floor(Math.random() * 3)]

सरणी का दूसरा भाग एक एक्सेस ऑपरेशन है, जिसका वर्णन जावास्क्रिप्ट में [5,6,8,7] [1,2] = 8 क्यों किया जाता है?


2
ऐसा कोड एक बुरा और हानिकारक अभ्यास है। इसका उपयोग कभी भी उत्पादन में नहीं किया जाना चाहिए। इसकी पठनीयता कम है और इसमें हार्डकोड की लंबाई है। सरणी इनपुट को बदलने वाला व्यक्ति अंत में हार्डकोड किए गए लंबाई को संपादित करना भूल सकता है।
सीगल

@ सेगुल ओपी ने कभी एक विशिष्ट वातावरण नहीं मांगा। साथ ही यह टिप्पणी निरर्थक है क्योंकि इसे इस प्रश्न के लगभग सभी उत्तरों पर लागू किया जा सकता है;)
आईजी पास्कल

लेकिन अधिकांश लोग Google खोज से इस प्रश्न पर आते हैं और मूल ओपी की तुलना में अन्य परिदृश्यों में समाधान का उपयोग कर सकते हैं।
सीगल

@ सियागुल हाहा लोग यह तय करने के लिए स्वतंत्र हैं कि किस दृष्टिकोण का उपयोग करना है, मैं स्वच्छ कोड दिशानिर्देश नहीं हूं!
आईजी पास्कल

10

सबसे छोटा संस्करण:

var myArray = ['January', 'February', 'March']; 
var rand = myArray[(Math.random() * myArray.length) | 0]

क्या करता | 0है?
केन शार्प

2
यह फ्लोट को इंट में बदल देगा, मठ के समान।
फॉक्सिरिस

4
@KenSharp | 0अपने आप में एक बिटवाइज़ ऑपरेशन है जो कुछ भी नहीं करता है, लेकिन किसी भी बिटवाइज़ ऑपरेशन से पहले जावास्क्रिप्ट फ़्लोट्स को किलों में बदल दिया जाता है । तो यह कुछ ऐसा है कि + ''वास्तव में कुछ भी कैसे नहीं किया जाता है लेकिन चीजों को तार में बदलने के लिए उपयोग किया जा सकता है।
dshepherd

यह वैसा नहीं है, Math.floorबल्कि यहां करना सही है। यह एक ऑपरेटर है इसलिए यह Math.floorकेवल तभी से तेज है जब किसी भी समय कुछ कोड चला सकते हैं Math.floor = someOtherFunctionऔर वे '' के लिए भी ऐसा नहीं कर सकते। दूसरी ओर के रूप में के लिए Math.floorऔर |अलग कोशिश Math.floor(-1.5)बनाम जा रहा है -1.5 | 0। वैसे आपको कोष्ठक की आवश्यकता नहीं है। |बहुत ही कम मिसाल है।
2

7

यदि आप इसे एक पंक्ति पर लिखना चाहते हैं, तो पास्कल के समाधान की तरह, एक और समाधान यह होगा कि आप ES6 के फंक्शन फ़ंक्शन का उपयोग करके इसे लिखें (इस तथ्य के आधार पर, कि किसी एक nआइटम को बेतरतीब ढंग से चुनने की संभावना है 1/n):

var item = ['A', 'B', 'C', 'D'].find((_, i, ar) => Math.random() < 1 / (ar.length - i));
console.log(item);

परीक्षण के उद्देश्यों के लिए उस दृष्टिकोण का उपयोग करें और यदि केवल अलग-अलग चर में सरणी को नहीं बचाने का एक अच्छा कारण है। अन्यथा अन्य उत्तर ( floor(random()*lengthऔर एक अलग कार्य का उपयोग करके) आपके जाने का रास्ता है।


बहुत मूल समाधान। अच्छा काम! वैसे, यहां एकमात्र वास्तविक और गतिशील एक-लाइनर समाधान है।
स्लाविक मेल्टर

7

Faker.js यादृच्छिक परीक्षण डेटा उत्पन्न करने के लिए कई उपयोगिता कार्य करता है। परीक्षण सूट के संदर्भ में यह एक अच्छा विकल्प है:

const Faker = require('faker');
Faker.random.arrayElement(['January', 'February', 'March']);

जैसा कि टिप्पणीकारों ने उल्लेख किया है, आपको आमतौर पर इस लाइब्रेरी का उपयोग उत्पादन कोड में नहीं करना चाहिए।


8
इस तरह की एक साधारण समस्या के लिए, पूरे पुस्तकालय के लिए एक निर्भरता जोड़ना अनावश्यक है और कोड ब्लोट में जुड़ जाता है। यदि कुछ भी हो, तो आप संभावित रूप से वास्तविक विधि की सिफारिश कर सकते हैं Fakerजिसमें से एक यादृच्छिक सरणी तत्व का चयन किया जाता है।
Pixxl

1
इस तरह की "सरल समस्या" आमतौर पर पुस्तकालयों द्वारा हल की जाती है जो एक ऐसी समस्या का सरल समाधान प्रदान करती है जो पहले से ही सौ लोगों को सामना करना पड़ता था। उन पुस्तकालयों को आम तौर पर मजबूत और अच्छी तरह से डिबग किया जाता है और विभिन्न कैविटीज़ से निपटते हैं जिन्हें हम फिर से लागू नहीं करना चाहते हैं। यह आमतौर पर ऐसी स्थिति होगी जहां मैं एक पुस्तकालय का उपयोग करने की सिफारिश करूंगा।
स्मॉनफ

बस आपको लाइब्रेरी से उस एक विधि को कॉपी करना चाहिए और एक बर्तनों की फाइल में रखना चाहिए
रिक ब्रॉस

वे सलाह जो पुस्तकालयों की लागत / लाभ WRT पृष्ठ भार के लिए आंकी जानी चाहिए, जब उन्हें वेब ब्राउज़र में भेज दिया जाता है तो ध्वनि की सलाह है और मैं पूरे दिल से मानता हूँ कि ब्राउज़र में Faker.js को शिपिंग करना हास्यास्पद होगा। हालांकि, इस सवाल का उल्लेख नहीं है कि जेएस रनटाइम का उपयोग किसके लिए किया जा रहा है। NodeJS आधारित रनटाइम के लिए भारी निर्भरता पूरी तरह से उचित है जो कि जहां मैं Faker.js का उपयोग कर रहा हूं, उसके लिए है - ककड़ी JS टेस्ट सूट में।
नाथन

6

ऐरे प्रोटोटाइप का संपादन हानिकारक हो सकता है। यहाँ यह काम करने के लिए एक सरल कार्य है।

function getArrayRandomElement (arr) {
  if (arr && arr.length) {
    return arr[Math.floor(Math.random() * arr.length)];
  }
  // The undefined will be returned if the empty array was passed
}

उपयोग:

// Example 1
var item = getArrayRandomElement(['January', 'February', 'March']);

// Example 2
var myArray = ['January', 'February', 'March'];
var item = getArrayRandomElement(myArray);

3

पुनरावर्ती, स्टैंडअलोन फ़ंक्शन जो किसी भी संख्या में आइटम वापस कर सकता है ( लॉज के समान )।

function getRandomElementsFromArray(array, numberOfRandomElementsToExtract = 1) {
    const elements = [];

    function getRandomElement(arr) {
        if (elements.length < numberOfRandomElementsToExtract) {
            const index = Math.floor(Math.random() * arr.length)
            const element = arr.splice(index, 1)[0];

            elements.push(element)

            return getRandomElement(arr)
        } else {
            return elements
        }
    }

    return getRandomElement([...array])
}

2

क्रिप्टो-मजबूत यादृच्छिक आइटम फॉर्म सरणी उपयोग प्राप्त करने के लिए

let rndItem = a=> a[rnd()*a.length|0];
let rnd = ()=> crypto.getRandomValues(new Uint32Array(1))[0]/2**32;

var myArray = ['January', 'February', 'March'];

console.log( rndItem(myArray) )


1

यह @Jacob Relkin के समाधान के समान, लेकिन सामान्य से अधिक है:

यह ES2015 है:

const randomChoice = arr => {
    const randIndex = Math.floor(Math.random() * arr.length);
    return arr[randIndex];
};

कोड 0 और सरणी की लंबाई के बीच एक यादृच्छिक संख्या का चयन करके काम करता है, फिर उस इंडेक्स पर आइटम वापस करता है।


1

var item = myArray[Math.floor(Math.random()*myArray.length)];

या समकक्ष छोटा संस्करण:

var item = myArray[(Math.random()*myArray.length)|0];

नमूना कोड:

var myArray = ['January', 'February', 'March'];    
var item = myArray[(Math.random()*myArray.length)|0];
console.log('item:', item);


1

सरल कार्य:

var myArray = ['January', 'February', 'March'];
function random(array) {
     return array[Math.floor(Math.random() * array.length)]
}
random(myArray);

या

var myArray = ['January', 'February', 'March'];
function random() {
     return myArray[Math.floor(Math.random() * myArray.length)]
}
random();

या

var myArray = ['January', 'February', 'March'];
function random() {
     return myArray[Math.floor(Math.random() * myArray.length)]
}
random();

बेहतर होगा कि आप अपने फंक्शन के अंदर myArrayy वैरिएबल को सेट करें क्योंकि यह ग्लोबल नेमस्पेस को प्रदूषित नहीं करता है।
नील मेयर

0

मेरी राय में, प्रोटोटाइप के साथ खिलवाड़ करने से बेहतर है, या इसे केवल समय में घोषित करना, मैं इसे खिड़की पर उजागर करना पसंद करता हूं:

window.choice = function() {
  if (!this.length || this.length == 0) return;
  if (this.length == 1) return this[0];
  return this[Math.floor(Math.random()*this.length)];
}

अब आपके ऐप पर कहीं भी आप इसे कॉल करते हैं जैसे:

var rand = window.choice.call(array)

इस तरह आप अभी भी for(x in array)लूप का उपयोग ठीक से कर सकते हैं


1
मैं यहां नहीं था जब किसी ने इसे डाउनवोट किया, और मैंने इसे डाउनवोट नहीं किया, लेकिन मेरा अनुमान है कि इसे विंडो में उजागर करना मूल रूप से एक वैश्विक चर घोषित कर रहा है। देखें: stackoverflow.com/questions/2613310/…
क्रिस

1
आपको कभी for...inभी सरणियों पर या सामान्य रूप से भी उपयोग नहीं करना चाहिए । आप प्रोटोटाइप श्रृंखला चलने का जोखिम उठाते हैं। यह किसी वस्तु के सभी गुणों के लिए भी है, सभी सूचकांकों में नहीं। यदि आप किसी सरणी पर एक पुनरावृत्त का उपयोग करना चाहते हैं, तो उपयोग करें for (var i = 0; i < foo.length; i++){}। और भी बेहतर, Array.prototype.forEachइसके बजाय कुछ का उपयोग करें ।
रॉबर्ट

1
मैं इसे पसंद नहीं करता क्योंकि यह वैश्विक दायरे को प्रदूषित करता है। आप कह सकते हैं कि यह केवल एक ही हो सकता है, लेकिन यह उस अच्छे अभ्यास का उल्लंघन करने की आदतें देगा।
जेक

0

मुझे शीर्ष उत्तर की जटिलताओं के चारों ओर एक रास्ता मिल गया है, बस चर रैंड को दूसरे चर में समेट कर, जो उस संख्या को myArray के कॉलिंग के अंदर प्रदर्शित करने की अनुमति देता है []; बनाई गई नई सरणी को हटाकर और इसके साथ जटिलताएं होने के कारण, मैं एक समाधान के साथ आया हूं:

<!DOCTYPE html>
<html>
<body>

<p id="demo"></p>

<script>

var myArray = ['January', 'February', 'March', 'April', 'May'];    

var rand = Math.floor(Math.random() * myArray.length);

var concat = myArray[rand];

function random() {
   document.getElementById("demo").innerHTML = (concat);
}
</script>

<button onClick="random();">
Working Random Array generator
</button>

</body>
</html>

मैं उलझन में हूँ कि concatयहाँ क्यों बदल रहा है ... randomखुद इसे नहीं बदल रहा है, और कुछ नहीं एक बार से अधिक कॉल किया जा रहा है ....
BalinKingOfMoria CMs

1
यह समाधान पूरी तरह से समझ में नहीं आता है। आप एक चर नाम क्यों बना रहे हैं?
अतिमहत्वाकांक्षी

0

static generateMonth() { 
const theDate = ['January', 'February', 'March']; 
const randomNumber = Math.floor(Math.random()*3);
return theDate[randomNumber];
};

आप सरणी के लिए एक निरंतर चर सेट करते हैं, आपके पास फिर एक और स्थिरांक होता है जो सरणी में तीन वस्तुओं के बीच यादृच्छिक रूप से चुनता है और फिर फ़ंक्शन केवल परिणाम लौटाता है।


-1

यादृच्छिक तत्व प्राप्त करने का एक सामान्य तरीका:

let some_array = ['Jan', 'Feb', 'Mar', 'Apr', 'May'];
let months = random_elems(some_array, 3);

console.log(months);

function random_elems(arr, count) {
  let len = arr.length;
  let lookup = {};
  let tmp = [];

  if (count > len)
    count = len;

  for (let i = 0; i < count; i++) {
    let index;
    do {
      index = ~~(Math.random() * len);
    } while (index in lookup);
    lookup[index] = null;
    tmp.push(arr[index]);
  }

  return tmp;
}


-1

रैंडोज इसे और अधिक सरल और पठनीय बनाते हैं:

console.log( rando(['January', 'February', 'March']).value );
<script src="https://randojs.com/1.0.0.js"></script>


1
बस जिज्ञासु: क्यों चढ़ाव?
लेपोन्जो

1
कुछ लोग पुस्तकालयों में कोड के लिए सोर्सिंग के प्रशंसक नहीं हैं, वे खुद को लिख सकते हैं, भले ही यह चीजों को तेज और अधिक पठनीय बना दे। यदि लाइब्रेरी किसी कारण से नीचे जाती है, तो आपकी वेबसाइट में एक गड़बड़ है। रैंडोज नीचे नहीं जाते हैं, लेकिन वे यह नहीं जानते हैं कि क्योंकि यह पुस्तकालयों के लिए jQuery जैसे उदाहरण के लिए नहीं जाना जाता है
आरोन प्लोकार्स्की

-2

यह कैसे करना है इसका एक उदाहरण है:

$scope.ctx.skills = data.result.skills;
    $scope.praiseTextArray = [
    "Hooray",
    "You\'re ready to move to a new skill", 
    "Yahoo! You completed a problem", 
    "You\'re doing great",  
    "You succeeded", 
    "That was a brave effort trying new problems", 
    "Your brain was working hard",
    "All your hard work is paying off",
    "Very nice job!, Let\'s see what you can do next",
    "Well done",
    "That was excellent work",
    "Awesome job",
    "You must feel good about doing such a great job",
    "Right on",
    "Great thinking",
    "Wonderful work",
    "You were right on top of that one",
    "Beautiful job",
    "Way to go",
    "Sensational effort"
  ];

  $scope.praiseTextWord = $scope.praiseTextArray[Math.floor(Math.random()*$scope.praiseTextArray.length)];


-3

एक यादृच्छिक मान बनाएं और सरणी में पास करें

कृपया निम्नलिखित कोड का प्रयास करें ..

//For Search textbox random value
var myPlaceHolderArray = ['Hotels in New York...', 'Hotels in San Francisco...', 'Hotels Near Disney World...', 'Hotels in Atlanta...'];
var rand = Math.floor(Math.random() * myPlaceHolderArray.length);
var Placeholdervalue = myPlaceHolderArray[rand];

alert(Placeholdervalue);

5
यह उत्तर पहले से स्वीकृत उत्तर के समान ही समाधान का उपयोग करता है। आपको एक ही समाधान को दो बार जोड़ने से बचना चाहिए और इसके बजाय केवल उन अन्य विकल्पों को लाना चाहिए जो बातचीत में अधिक योगदान देंगे।
Pixxl
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.