@boga-net

Как отсеивать повторяющиеся числа в Math.random?

Всем привет. Необходимо вывести на страницу n-ое кол-во элементов (с числами) в случайном порядке. Ну или n-ое кол-во элементов в обычном порядке, но со случайными числами. Числа не должны повторяться. Может я не так начал, но я использую Math.rand();
Есть несколько кнопок с числами, которые определяют, сколько элементов будет создано на странице. А так же эти числа определяют нумерацию этих элементов. Всё получилось, и создание и нумерация, но только не получилось сделать рандомные неповторяющиеся числа на этих элементах.

в общем, нужно получить что-то такое, если на 8 чисел :

4 7 1
5 2 9
8 6

9 2 3
6 5 1
4 8

ссылка на jsfiddle

<div class="buttons">
  <div class="btn" data-amont="3">3</div>
  <div class="btn" data-amont="8">8</div>
  <div class="btn" data-amont="15">15</div>
  <div class="btn" data-amont="24">24</div>
</div>


// Получить выбранное кол-во блоков
$('.btn').on('click', function() {
	var x = $(this).text();
	setBlocks(x);
});

// Установить кол-во блоков
function setBlocks(x) {

	for (var i = 1; i <= x; i++) {
		var res = getRandom(1, x);
		
		var block = '<div class="box" data-num="'+ res +'">'+ res +'</div>';
		wrap.append(block);
	}
}

// Получить рандомное число
function getRandom(min, max) {
	var arr = [];
	for (var i = 0; i < max; i++) {
		x = Math.floor(Math.random() * (max - min + 1)) + min;

		if (arr.indexOf(x)) {
			return;
                        // или return Math.floor(Math.random() * (max - min + 1)) + min;
		}
		else {
 			arr.push(x);
		}
		
		return arr;
	}
}

Вот здесь не пойму, как делать проверку на наличие числа в массиве. В воображении всё просто : перебираю элементы в цикле (цикл = длина переменной max), и каждую итерацию цикла запускаю функцию, которая возвращает рандомное число. Потом это число записываю в массив. Если такое число уже есть, то снова запускаю рандомное число или return.
Пол дня уже сижу, ломаю голову.

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

Спасибо
  • Вопрос задан
  • 4360 просмотров
Решения вопроса 2
longclaps
@longclaps
function getRandomSet(lo, hi, n) { // я привык к тому, что min и max - функции )))
    var res = new Set();
    while (res.size < n) res.add(Math.floor(Math.random() * (hi - lo + 1)) + lo);
    return res;
}

console.log(getRandomSet(0, 9, 5));
Ответ написан
delphinpro
@delphinpro Куратор тега JavaScript
frontend developer
Может просто перемешать массив чисел?

function shuffle( array ) {
  for(var j, x, i = array.length; i; j = parseInt(Math.random() * i), x = array[--i], array[i] = array[j], array[j] = x);
    return true;
}

var a = [1,2,3,4,5,6,7,8,9];

shuffle(a);

out.innerHTML = a.toString();

https://jsfiddle.net/uhhqben9/

UPDATE:

Все просто — функция перемешивает массив чисел.

Вот ваша функция:

function getRandom(min, max) {
  var arr = [];
  for (var i = 0; i < max; i++) {
    x = Math.floor(Math.random() * (max - min + 1)) + min;
    if (arr.indexOf(x)) {
      return;
    }
    else {
      arr.push(x);
    }
    return arr;
  }
}


Дорабатываем ее с использованием функции shuffle:

function getRandom(min, max) {
  // Получаем массив чисел из диапазона от min до max
  var arr = Array.from(Array(max - min + 1).keys(), x => x + min);
  // Перемешиваем
  shuffle(arr);
  // возвращаем перемешанный массив
  return arr;
}


И можем использовать для получения массивов неповторяющихся случайных чисел

var a = getRandom(3,15);

https://jsfiddle.net/uhhqben9/1/

.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
17 мая 2024, в 22:37
20000 руб./за проект
17 мая 2024, в 22:33
1000 руб./за проект
17 мая 2024, в 22:30
5000 руб./за проект