এলোমেলো মান সহ একটি অ্যারে তৈরি করুন


104

আমি 0 থেকে 39 পর্যন্ত এলোমেলো মান সহ 40 টি উপাদান সহ একটি অ্যারে কীভাবে তৈরি করতে পারি? পছন্দ

[4, 23, 7, 39, 19, 0, 9, 14, ...]

আমি এখান থেকে সমাধানগুলি ব্যবহার করার চেষ্টা করেছি:

http://freewebdesignt টিউটোরিয়ালস / javaScript টিউটোরিয়ালস / jsArrayObject/randomizeArrayElements.htm

তবে আমি যে অ্যারে পাই তা খুব কম এলোমেলোভাবে করা হয়। এটি ধারাবাহিক সংখ্যক ব্লক তৈরি করে ...

উত্তর:


52

এখানে এমন একটি সমাধান রয়েছে যা অনন্য সংখ্যার একটি তালিকা পরিবর্তন করে (কোনও পুনরাবৃত্তি হয় না)।

for (var a=[],i=0;i<40;++i) a[i]=i;

// http://stackoverflow.com/questions/962802#962890
function shuffle(array) {
  var tmp, current, top = array.length;
  if(top) while(--top) {
    current = Math.floor(Math.random() * (top + 1));
    tmp = array[current];
    array[current] = array[top];
    array[top] = tmp;
  }
  return array;
}

a = shuffle(a);

আপনি যদি বারবার মানগুলি (যা ওপি চেয়েছিল তা নয়) মঞ্জুরি দিতে চান তবে অন্য কোথাও দেখুন। :)


4
সংখ্যাগুলি অনন্য হওয়া উচিত এই সমাধানটি ভাল তবে এটি সম্পূর্ণ আলাদা পরিসংখ্যান / সম্ভাব্য জিনিস। আমি আশা করি এটি ওপি-র কাছে স্পষ্ট ছিল এবং তাদের ক্ষেত্রে প্রাসঙ্গিক ছিল না, তবে নির্দিষ্ট কিছু ক্ষেত্রে এটি প্রোগ্রামের যথার্থতার উপর বড় প্রভাব ফেলতে পারে। (আমি উত্তরের সমালোচনা করছি না, কেবল ভবিষ্যতের পাঠকদের জন্য একটি পতাকা উত্তোলন করছি। আপনি এটি উল্লেখ করতে পারেন)) আরও দেখুন: en.wikedia.org/wiki/Combination ("পুনরাবৃত্তি ছাড়াই" বা "সাথে" পার্থক্য )
চিককোডোরো

var এলোমেলো_আররে = নতুন অ্যারে (40) .ফিল ()। মানচিত্র ((a, i) => a = i)। বাছাই করুন (())> ম্যাথ.রেন্ডম () - 0.5) আমি মনে করি এটি উপরের মতোই করে
জ্যামি 337nichol

এটি 0 নম্বর উত্পন্ন করা থেকে কীভাবে বাদ দেবেন?
গোসি

এটি একটি ES6 সংস্করণ যা আপনাকে ন্যূনতম / সর্বাধিক কিছুটা নমনীয়তা দেয় তবে এখনও আপনাকে অনন্য সংখ্যার একটি অ্যারে দেয়: pastie.org/p/069IAzSzsRhN6JXdAIpPhc
কর্ট

219

সবচেয়ে সংক্ষিপ্ত পদ্ধতির (ES6)

// randomly generated N = 40 length array 0 <= A[N] <= 39
Array.from({length: 40}, () => Math.floor(Math.random() * 40));

উপভোগ করুন!


তুমি ঠিক. আমার মন্তব্য মুছে ফেলা হয়েছে। প্রকৃততম সংক্ষিপ্ত উপায়ে সংশোধিত সংস্করণ: [... অ্যারে (20)] map মানচিত্র (() => Math ম্যাথ.ফ্লোর (ম্যাথ.র্যান্ডম () * 30) {);
জাহেরহো

7
যদি আমরা উত্তরের পদ্ধতির থেকে স্থানগুলি সরিয়ে ফেলি, তবে এটি আপনার প্রস্তাবিতের চেয়ে 4 টি কম অক্ষর। অবশ্যই, আপনি যদি গল্ফ খেলতে আগ্রহী হন তবে আপনি কিছু সহজ চরিত্র কাটা শর্টকাটগুলি বাদ দিয়েছিলেন: [...Array(40)].map(_=>Math.ceil(Math.random()*40));আপনার চেয়ে 11 টির চেয়ে কম এবং মূলের চেয়ে 7 টি কম।
কাইল বেকার

(সংশোধন করার জন্য খুব দ্রুত ছিল না - যদি আমরা ব্যবহার করি তবে ওপির মানদণ্ডগুলি পূরণ করতে * 39 হওয়া দরকার - Math.ceilযদিও আমরা 0 হিসাবে বিকল্প হিসাবে কেটে ফেলেছি 0 যদি আমরা 0-39 এর পরিবর্তে 1-40 গ্রহণ করতে পারি তবে তা কার্যকর হয় Otherwise নইলে , ফিরে যেতে উন্নতির একটি চরিত্র হ্রাস করুন Math.floor)
কাইল বেকার

45

ES5:

function randomArray(length, max) {
    return Array.apply(null, Array(length)).map(function() {
        return Math.round(Math.random() * max);
    });
}

ES6:

randomArray = (length, max) => [...new Array(length)]
    .map(() => Math.round(Math.random() * max));

4
তর্ক _এবং iতর্ক সঙ্গে কি ? আমি ভুল না হলে ES6 এ অপ্রয়োজনীয়।
আফ্রিকানম্যাট

4
@ আফ্রিকানম্যাট, _বর্তমান উপাদান এবং iবর্তমান সূচক। আপনি ঠিক বলেছেন, তারা উভয় ক্ষেত্রেই অপ্রয়োজনীয়। আপনি চাইলে এগুলি সরাতে পারেন।
ইউজিন কুলাবোভভ

4
আমি জানি না আপনি ES6 এর সেই সংস্করণটি কোথায় বিশ্বাস করেন? অ্যারে.ফর্ম কাজ করে ... আপনার কোডের সাথে এখানে একটি উদাহরণ ... র্যান্ডমআরে = (দৈর্ঘ্য: সংখ্যা, সর্বাধিক: সংখ্যা) => অ্যারে.ফ্রোম ({দৈর্ঘ্য}) .ম্যাপ (() => ম্যাথ.ফ্লোয়ার .random () * সর্বাধিক));
খ্রিস্টান ম্যাথু

34

এমনকি ছোট ES6 পদ্ধতির:

Array(40).fill().map(() => Math.round(Math.random() * 40))

এছাড়াও, আপনি আর্গুমেন্ট সহ একটি ফাংশন রাখতে পারেন:

const randomArray = (length, max) => 
  Array(length).fill().map(() => Math.round(Math.random() * max))

4
.ফিল () এর জন্য একটি মান প্যারামিটার প্রয়োজন
ড্যামিয়ান গ্রিন

4
@ ডামিয়ানগ্রিন - .fill()কোনও প্যারামিটার ছাড়াই অ্যারে পূরণ করবে undefined, যা এখানে .map()কাজ করার জন্য একমাত্র প্রয়োজনীয় জিনিস
vsync

@ দামজান কি সংখ্যা পুনরাবৃত্তি না করার উপায় আছে? এই পদ্ধতিটি পছন্দ করেছে
হেনরিক

@ হেনরিক ভেরিয়েবল ব্যবহার করছেন? 🤔
সেবজ

@ সেবেজ কি সম্ভব? আমি বলতে চাইছি, দৈর্ঘ্য এবং সর্বোচ্চ হিসাবে প্রপসের সাথে সংক্ষিপ্ত যে কোনও পন্থা আমার পক্ষে নিখুঁতভাবে কাজ করবে :)
হেনরিক

32

সংক্ষিপ্ত :-)

[...Array(40)].map(e=>~~(Math.random()*40))


20
~~ম্যাথ.ফ্লুরের শর্টহ্যান্ড
কর্ট

4
এটা অসাধারণ; যে জন্য সেখানে ব্যাপক সমর্থন আছে~~ শর্টহ্যান্ডের ? (সম্পাদনা: আহ, এটি কেবল কিছুটা অপারেটর অপারেটর , আমি দেখতে পেলাম)
রাফ গোল্ডবার্গ ২

@ ইতিবাচক সংখ্যার জন্য কার্ট করুন
এজে

4
দুঃখের বিষয়, কোনও "কার্ট" উত্তর নয়। সে হাসি দিয়ে জবাব দিল।
অক্সিজেন

@ আজপ্পল ওপি 0-39 এর একটি নির্দিষ্ট উদাহরণ চেয়েছিল, তাই কেবল তা বন্ধ করে দেওয়া
কার্ট

16

Math.random()0 এবং 1 (একচেটিয়া) এর মধ্যে একটি নম্বর প্রদান করবে। সুতরাং, যদি আপনি 0-40 চান, আপনি এটি 40 দ্বারা গুণিত করতে পারেন, আপনি যেটি দিয়ে গুণাচ্ছেন তার ফলাফল সবচেয়ে বেশি হতে পারে।

var arr = [];
for (var i=0, t=40; i<t; i++) {
    arr.push(Math.round(Math.random() * t))
}
document.write(arr);

http://jsfiddle.net/robert/tUW89/


4
স্পষ্ট করার জন্য: এটি "L = 40", "i <l" এবং "ম্যাথআরেন্ডম () * l" - তে 1 নম্বরের একটি চিঠি, এল ফন্টটি এটি বলা শক্ত করে তোলে।
মিঃ মাইন্ড

11

.. আমি যে অ্যারে পাই তা খুব কম এলোমেলোভাবে করা হয়। এটি ধারাবাহিক সংখ্যক ব্লক তৈরি করে ...

এলোমেলো আইটেমের সিকোয়েন্সগুলি প্রায়শই ক্রমাগত সংখ্যার ব্লক ধারণ করে, জুবলারের মিথ্যাচার দেখুন । উদাহরণ স্বরূপ:

.. আমরা একটানা চারটি মাথা ছুঁড়েছি .. যেহেতু পাঁচটি ধারাবাহিক মাথা চালানোর সম্ভাবনা কেবল 1-22 হয় .. জুয়াড়ারের ত্রুটিযুক্ত ব্যক্তির বিশ্বাস হতে পারে যে পরবর্তী ফ্লিপটি মাথা হওয়ার সম্ভাবনা কম ছিল লেজ হতে। http://en.wikedia.org/wiki/Gamblers_fallacy


ঠিক +1 একজনকে বাস্তবের (পরিসংখ্যানগতভাবে) এলোমেলো সংখ্যা বা "এলোমেলো দেখায়" এমন সংখ্যার প্রয়োজন কিনা তা সিদ্ধান্ত নিতে হবে।
চিককোডোরো

5
let randomNumber = Array.from({length: 6}, () => Math.floor(Math.random() * 39));

এটি দেখতে সহজেই তৈরি করতে অ্যারেটিকে 6 টি মানের মধ্যে সীমাবদ্ধ করুন।


4

যেহেতু সংখ্যার ব্যাপ্তি সীমাবদ্ধ, তাই আমি বলব সবচেয়ে ভাল কাজটি অ্যারে তৈরি করা, এটি শূন্য নম্বরটি 39 (ক্রম) এর মাধ্যমে পূরণ করুন, তারপরে এটি পরিবর্তন করুন।



আমি জানি না যে তিনি প্রতিটি নম্বর চান, কিন্তু সম্পূর্ণ এলোমেলো? যদি তিনি এলোমেলো অর্ডার, স্থির মান দিয়ে ভাল থাকেন তবে এটি ঠিকঠাক কাজ করবে।
রবার্ট

যা কাজটি করতে পারে তবে আপনি Math.random()৪০ বার ব্যবহার করলে কিছুটা আলাদা ফলাফল দেবে , যেহেতু এটি প্রতিটি সংখ্যা একবারে প্রদর্শিত হবে এবং পুনরাবৃত্তি হবে না।
মিঃ মাইন্ড

3
var myArray = [];
var arrayMax = 40;
var limit = arrayMax + 1;
for (var i = 0; i < arrayMax; i++) {
  myArray.push(Math.floor(Math.random()*limit));
}

এটি উপরের এটি traditionalতিহ্যবাহী উপায় তবে আপনি ব্যয়বহুল গণনা না করে যদি আপনার অ্যারেতে সদৃশগুলি এড়াতে চান তবে আমি দ্বিতীয় @ পয়েন্ট এবং @ ফ্রোগজকে দ্বিতীয় করে দিচ্ছি


3

রোজ একা-লাইন সমাধানগুলিতে ক্রিক করুন।

অ্যারেগুলিতে মানগুলি মোট এলোমেলো, সুতরাং আপনি যখন এই স্নিপেটগুলি ব্যবহার করবেন তখন এটি ভিন্ন হবে।

ছোট হাতের অক্ষরে অক্ষরযুক্ত অক্ষরের সাথে একটি অ্যারে (দৈর্ঘ্য 10)

Array.apply(null, Array(10)).map(function() { return String.fromCharCode(Math.floor(Math.random() * (123 - 97) + 97)); })

['কে', 'এ', 'এক্স', 'ই', 'এন', 'ডাব্লু', 'এম', 'কিউ', 'বি', 'জ']

0 থেকে 99 পর্যন্ত এলোমেলো পূর্ণসংখ্যার সংখ্যার সাথে একটি অ্যারের (দৈর্ঘ্য 10)

Array.apply(null, Array(10)).map(function() { return Math.floor(Math.random() * 100 % 100); })

[86, 77, 83, 27, 79, 96, 67, 75, 52, 21]

একটি অ্যারের এলোমেলো তারিখ (10 বছর আগে থেকে এখন অবধি)

Array.apply(null, Array(10)).map(function() { return new Date((new Date()).getFullYear() - Math.floor(Math.random() * 10), Math.floor(Math.random() * 12), Math.floor(Math.random() * 29) )})

[2008-08-22T21: 00: 00.000Z, 2007-07-17T21: 00: 00.000Z, 2015-05-05T21
: 00: 00.000Z, 2011-06-14T21: 00: 00.000Z,
2009-07-23T21 : 00: 00.000Z, 2009-11-13T22: 00: 00.000Z,
2010-05-09T21: 00: 00.000Z, 2008-01-05T22: 00: 00.000Z, 2016-05-06T21
: 00: 00.000Z, 2014-08-06T21: 00: 00.000Z]

একটি অ্যারে (দৈর্ঘ্য 10) এলোমেলো স্ট্রিং

Array.apply(null, Array(10)).map(function() { return Array.apply(null, Array(Math.floor(Math.random() * 10  + 3))).map(function() { return String.fromCharCode(Math.floor(Math.random() * (123 - 97) + 97)); }).join('') });

['কিউবঝাফ', 'বিএমউইউই', 'আলহোবড', 'সিউড', 'টাইনুল্লিন', 'ভিপিপিডিফ্লারহ্নফ', 'এইচভিজি', 'আরাজুলন', 'জেজেজ', 'সিক্স']

আপনি দরকারী অন্যান্য জিনিসগুলি এখানে দেখতে পাবেন https://github.com/setivolkylany/nodejs-utils/blob/master/utils/faker.js


1

কিছু নতুন ES6 বৈশিষ্ট্য ব্যবহার করে, এখন এটি ব্যবহার করে অর্জন করা যেতে পারে:

function getRandomInt(min, max) {
    "use strict";
    if (max < min) {
        // Swap min and max
        [min, max] = [min, max];
    }

    // Generate random number n, where min <= n <= max
    let range = max - min + 1;
    return Math.floor(Math.random() * range) + min;
}

let values = Array.from({length: 40}, () => getRandomInt(0, 40));

console.log(values);

দ্রষ্টব্য যে এই সমাধানটি কেবলমাত্র আধুনিক ব্রাউজারগুলিতে কাজ করবে যা এই ES6 বৈশিষ্ট্যগুলিকে সমর্থন করে: তীর ফাংশন এবং অ্যারে.ফ্রোম ()।



0

@ ফ্রোগজ প্রস্তাবিত পৃষ্ঠা থেকে

for (var i=0,nums=[];i<49;i++) nums[i]={ n:i, rand:Math.random() };
nums.sort( function(a,b){ a=a.rand; b=b.rand; return a<b?-1:a>b?1:0 } );

0

এই সমাধানগুলি যা দিয়েছিল তার থেকে আমার কিছুটা আলাদা দরকার ছিল, এটিতে আমার নির্দিষ্ট রেঞ্জের সাথে থাকা বিভিন্ন স্বতন্ত্র এলোমেলো সংখ্যার একটি অ্যারে তৈরি করা দরকার। নীচে আমার সমাধান।

function getDistinctRandomIntForArray(array, range){
   var n = Math.floor((Math.random() * range));
   if(array.indexOf(n) == -1){        
    return n; 
   } else {
    return getDistinctRandomIntForArray(array, range); 
   }
}

function generateArrayOfRandomInts(count, range) {
   var array = []; 
   for (i=0; i<count; ++i){
    array[i] = getDistinctRandomIntForArray(array, range);
   };
   return array; 
}

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


0
function shuffle(maxElements) {
    //create ordered array : 0,1,2,3..maxElements
    for (var temArr = [], i = 0; i < maxElements; i++) {
        temArr[i] = i;
    }

    for (var finalArr = [maxElements], i = 0; i < maxElements; i++) {
        //remove rundom element form the temArr and push it into finalArrr
        finalArr[i] = temArr.splice(Math.floor(Math.random() * (maxElements - i)), 1)[0];
    }

    return finalArr
}

আমার ধারণা এই পদ্ধতিটি সম্ভাব্যতাগুলির সাথে সমস্যার সমাধান করবে, কেবল এলোমেলো সংখ্যার জেনারেটর দ্বারা সীমাবদ্ধ।


0

আপনার যদি 0 থেকে দৈর্ঘ্যের ব্যাপ্তি থেকে এলোমেলো অনন্য মানগুলির প্রয়োজন হয়:

const randomRange = length => {
  const results = []
  const possibleValues = Array.from({ length }, (value, i) => i)

  for (let i = 0; i < length; i += 1) {
    const possibleValuesRange = length - (length - possibleValues.length)
    const randomNumber = Math.floor(Math.random() * possibleValuesRange)
    const normalizedRandomNumber = randomNumber !== possibleValuesRange ? randomNumber : possibleValuesRange

    const [nextNumber] = possibleValues.splice(normalizedRandomNumber, 1)

    results.push(nextNumber)
  }

  return results
}

randomRange(5) // [3, 0, 1, 4, 2]

0

আমি নিশ্চিত যে এটি কোনও পুনরাবৃত্তি ছাড়াই আপনার এলোমেলো অ্যারে তৈরি করার সবচেয়ে সংক্ষিপ্ততম উপায়

var random_array = new Array(40).fill().map((a, i) => a = i).sort(() => Math.random() - 0.5);

"নিশ্চিত", কিভাবে ব্যবহার সম্পর্কে keysফাংশন: Array.from(Array(40).keys()).sort(_ => Math.random() - .5)? আপনি এমনকি ক্রেজি হতে পারে, এবং স্প্রেড অপারেটর ব্যবহার করুন! তবে এটি এখন আমার জন্য খুব উত্তেজনাপূর্ণ।
ইয়েতি

0

পার্টিতে কিছুটা দেরি হয়ে গেছে তবে আমি এলোমেলোভাবে র্যান্ডোজস ডট কম ব্যবহার করি কারণ এটি এই সুপারের মতো সহজ জিনিসকে সহজ করে তোলে। আপনি 0 থেকে 39 এর মধ্যে এ জাতীয় এলোমেলোভাবে শ্যাফলেড অ্যারে পেতে পারেন:

console.log(randoSequence(40));
<script src="https://randojs.com/1.0.0.js"></script>

এটির লজিস্টিকগুলির সাথে কোনও গোলমাল নয় - এটি সুপার পঠনযোগ্য এবং বোঝা সহজ :)


0

জেনারেটর

মান পুনরাবৃত্তি না করে 40 এর 40 টি এলোমেলো সম্ভাব্য মানগুলির (0 - 39) দৈর্ঘ্যের একটি অ্যারে @ ফরাস এবং @ জ্যারেড বেক ব্যাখ্যা হিসাবে এটিকে বদলে নেওয়া ভাল। অন্য রেকর্ড, কেবল রেকর্ডের জন্য, জেনারেটর ব্যবহার করা যেতে পারে। তবে অন্যান্য প্রস্তাবিত সমাধানগুলির তুলনায় এই পদ্ধতির কার্য সম্পাদনের অভাব রয়েছে

function* generateRandomIterable(n, range) {
  for (let i = 0; i < n; i++) {
    yield ~~(Math.random() * range);
  }
}
const randomArr = [...generateRandomIterable(40,40)];

0

এখানে একটি ES6 ফাংশন রয়েছে যা একটি নূন্যতম এবং সর্বাধিক মঞ্জুরি দেয় এবং এলোমেলো ক্রমে অনন্য মানগুলির একটি অ্যারে উত্পন্ন করবে যা নূন্যতম থেকে সর্বোচ্চ অন্তর্ভুক্ত পর্যন্ত সমস্ত সংখ্যক ধারণ করে:

const createRandomNumbers = (min, max) => {
  const randomNumbers = new Set()
  const range = max - min + 1

  while (randomNumbers.size < range) {
    randomNumbers.add(~~(Math.random() * range))
  }

  return [...randomNumbers]
}

0

কারণ *এর চেয়ে বেশি অগ্রাধিকার রয়েছে |, এটি |0প্রতিস্থাপনের সাহায্যে খাটো করা যেতে পারে Math.floor()

[...Array(40)].map(e=>Math.random()*40|0)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.