Как я могу создать случайное число в пределах диапазона, но исключить некоторые? - PullRequest
12 голосов
/ 02 апреля 2011

В основном я выбираю случайное число в диапазоне от 0 до 24:

Math.floor(Math.random() * myArray.length); // myArray contains 25 items

Допустим, получится, что оно равно 8. Теперь я хочу получить другое число в том же диапазоне 0-24, но на этот раз,Я не хочу 8. В следующий раз я могу бросить 15. Теперь я хочу бросить снова, но я не хочу 8 или 15. Теперь я обращаюсь с этим с помощью циклов do while и есличисло получается таким же, я просто перезаписываю.

Это небольшая часть моей домашней работы, и у меня, на самом деле, она работает, чтобы соответствовать всем требованиям, так что я думаю, вы могли бы сказать, что это для моего личногоблаго, так что я могу написать это правильно и не в конечном итоге на "ежедневный вес".

Ответы [ 8 ]

18 голосов
/ 02 апреля 2011

Установить массив со всеми значениями (это допустимая опция, только если вы делаете только маленькие числа, например, 25 в вашем примере) , например:

var array = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24];

затем выберите случайное число от 0 до длины массива:

var num = Math.floor(Math.random() * array.length);

удалите этот индексный номер из массива:

var roll = array.splice(num, 1);

Javascript splice () удаляет проиндексированные элементы из массива и возвращает элемент (ы) в виде массива.Идеально для вашего использования.

Возьмите первый индекс с рулона, так как мы все равно вырезаем только 1:

var yourNumber = roll[ 0 ];

Продолжайте делать столько бросков, сколько вы хотите.Кроме того, вы можете сохранить исходный массив как копию, чтобы вы могли легко «сбросить» числа.

5 голосов
/ 03 июня 2015

Это просто, ребята. Вы не хотите рекурсию для этого. Эти ответы действительно плохие. В идеале вы также не хотите жестко кодировать массив.

function getRandomWithOneExclusion(lengthOfArray,indexToExclude){

  var rand = null;  //an integer

    while(rand === null || rand === indexToExclude){
       rand = Math.round(Math.random() * (lengthOfArray - 1));
    }

  return rand;
}

теперь используйте значение, возвращаемое из вышеуказанной функции, чтобы выбрать элемент из любого массива, который вы хотите, просто так:

var arr = [];
var random = getRandomWithOneExclusion(arr.length,5);  //array has length x, we want to exclude the 5th element
var elem = arr[random];

вот и все. если вы хотите исключить больше, чем значение, то вам придется сделать это более сложным, но для исключения одного значения это работает хорошо. Рекурсивное решение для этого - излишнее и плохая идея.

Я не проверял это, но чтобы исключить более одного элемента, попробуйте это:

function getRandomWithManyExclusions(originalArray,arrayOfIndexesToExclude){

   var rand = null;

   while(rand === null || arrayOfIndexesToExclude.includes(rand)){
         rand = Math.round(Math.random() * (originalArray.length - 1));
    }
     return rand;
  }

Вышеуказанный метод не слишком отличается от оригинального метода OP. Этот метод работает правильно, потому что он не производит выборочную выборку из массива.

2 голосов
/ 02 апреля 2011

Гмц: -?Самый быстрый способ случайного получения элементов из массива и обеспечения их уникальности:

var array = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24];

Array.prototype.shuffle = function shuffle(){
    var tempSlot;
    var randomNumber;
    for(var i =0; i != this.length; i++){
        randomNumber = Math.floor(Math.random() * this.length);
        tempSlot = this[i]; 
        this[i] = this[randomNumber]; 
        this[randomNumber] = tempSlot;
    }
}

while(array.length!=0){
    array.shuffle();
    alert(array.pop());    
}
0 голосов
/ 21 апреля 2018

Предположим, вам нужно выбрать случайное число из диапазона 1...5 и исключить значения 2, 4, затем:

  • Выбрать случайное число из диапазона 1...3
  • Сортировать список исключенных номеров
  • Для каждого исключенного номера, меньшего, чем случайное число: добавить единицу к случайному числу

function getRandomExcept(min, max, except) {
  except.sort(function(a, b) {
    return a - b;
  });
  var random = Math.floor(Math.random() * (max - min + 1 - except.length)) + min;
  var i;
  for (i = 0; i < except.length; i++) {
    if (except[i] > random) {
      break;
    }
    random++;
  }
  return random;
}

/*
 * Test iterations. Make sure that:
 * excluded numbers are skipped 
 * numbers are equally distributed
 */
(function(min, max, except) {
  var iterations = 1000000;
  var i;
  var random;
  var results = {};
  for (i = 0; i < iterations; i++) {
    random = getRandomExcept(min, max, except);
    results[random] = (results[random] || 0) + 1;
  }
  for (random in results) {
    console.log("value: " + random + ", count: " + results[random] + ", percent: " + results[random] * 100 / iterations + "%");
  }
})(1, 5, [2, 4]);
0 голосов
/ 15 февраля 2017

<div id="number" style="color: red; margin-left: 200px;">array</div>
<div id="arr" style="color: red; margin-left: 200px;">length</div>
<script>
  var arrayOfIndexesToExclude = new Array();
  function getRandomWithManyExclusions(){
    var rand = null;
      
		  	do{
		    	rand = Math.round(Math.random() * ( 9));
		    	if(arrayOfIndexesToExclude.length >= 10){
		 			  arrayOfIndexesToExclude.length = 0;	   			
		    	}
				}while(arrayOfIndexesToExclude.includes(rand));
			
			arrayOfIndexesToExclude.push(rand);  
    
    document.getElementById("number").innerHTML = arrayOfIndexesToExclude;
    document.getElementById("arr").innerHTML = arrayOfIndexesToExclude.length;
  }
</script>
0 голосов
/ 09 июня 2014

Вот проверенное и простое решение:

var array= [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24];
var random_value; 
var index;
var shuffled_array = new Array(24);

for (var i = 0; i < 24; i++) { 
random_value = array[Math.floor(Math.random()*array.length)]; //Returns a value between 1 and 24
index = array.indexOf(random_card); //Gets the index of the choosen random value
array.splice(index, 1); //Go to index of that array and remove it
shuffled_array [i] = random_value; //Put that value in a new array

window.alert("array: "+array+"\n"+"random_value: "+random_value+"\n"+"shuffled_array: "+shuffled_array);
}

В других решениях, я полагаю, они забыли поиск индекса.

0 голосов
/ 02 апреля 2011

шаг 1> создать массив CHECK_ARRAY заполнить массив значением, которое находится вне диапазона вашего случайного числа [заполните его 26, если вы хотите сгенерировать число в пределах 0-25]

step2-> сгенерировать случайное число и добавить его в RANDOM_ARRAY, а также добавить его в CHECK_ARRAY то есть

i=0;
CHECK_ARRAY[i]=random;
i++;

step3-> сгенерируйте новое случайное число и перейдите через CHECK_ARRAY, если вы нашли 26, затем проигнорируйте, иначе, если вы нашли дубликат, сгенерируйте случайное число снова и продолжайте шаг 3, пока не найдете уникальное случайное число! 1006 *

0 голосов
/ 02 апреля 2011

Я уверен, что есть несколько способов сделать это, но вы можете сложить все числа в что-то вроде стека, перемешать их все, а затем выскочить из них, чтобы получить ваши случайные числа. Или случайным образом каждый раз ищите его и удаляйте из стека.

...