Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Генератор случайных чисел без повторений в последующих генерациях (https://javascript.ru/forum/misc/70730-generator-sluchajjnykh-chisel-bez-povtorenijj-v-posleduyushhikh-generaciyakh.html)

Samik 28.09.2017 17:50

Генератор случайных чисел без повторений в последующих генерациях
 
Всем привет! Прошу помочь с одной задачей. Нужно сделать генератор случайных чисел из диапазона чисел, но так чтобы в последующих генерациях числа не повторялись, и чтобы можно было менять кол-во генерации значений. Генерация до тех пока числа не кончатся, потом заново генерация. Возможно ли как то реализовать это?
  1. Ввели диапазон чисел
  2. Выбрали количество значений
  3. Нажали генерировать
  4. Числа сгенерировались и записалось в бд (12 5 7 23 8 9)
  5. Нажали генерировать
  6. Проверяются числа из уже сделанных предыдущих генераций (предыдущая генерация: 12 5 7 23 8 9)
  7. Генерируются числа которые еще не отображались (25 6 3 4 36 2)
  8. Вывод на экран (25 6 3 4 36 2)
  9. Кнопочка очистить значения чтобы начать заново


Пример:
Диапазон чисел: 0-48
Количество значений за 1 генерацию: 6
Нажимаем кнопку, генерируются числа
Результат:
Генерация 1: 12 5 7 23 8 9
Генерация 2: 25 6 3 4 36 2
Генерация 3: 17 21 27 42 15 39

Не просто генерация чисел, не так чтобы выдала:
Генерация 1: 12 5 7 23 8 9
Генерация 2: 11 7 15 33 43 10
Генерация 3: 8 22 34 47 0 13

Выделены цифры которые повторяются при последующей генерации

рони 28.09.2017 18:04

Samik,
создали массив, перемешали, пока длина массива больше n, то return arr.splice(0,n) иначе ... ???

Samik 28.09.2017 18:20

Цитата:

Сообщение от рони (Сообщение 465877)
Samik,
создали массив, перемешали, пока длина массива больше n, то return arr.splice(0,n) иначе ... ???

такс пока не въехал :-?

рони 28.09.2017 18:26

Цитата:

Сообщение от Samik
Диапазон чисел: 0-48
Количество значений за 1 генерацию: 6

что будет на 9-ой генерации?

Samik 28.09.2017 18:47

Цитата:

Сообщение от рони (Сообщение 465882)
что будет на 9-ой генерации?

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

рони 28.09.2017 18:57

Samik,
:blink: не понимаю, что вы пишите. вопрос вроде простой: что будет на 9-ой генерации?


Samik 28.09.2017 19:36

Цитата:

Сообщение от рони (Сообщение 465885)
Samik,
:blink: не понимаю, что вы пишите. вопрос вроде простой: что будет на 9-ой генерации?


Ну смотри:
диапазон: 0-10
Количество значений за 1 генерацию: 3

Генерация 1: 1 3 5
Генерация 2: 2 4 6
Генерация 3: 7 9 8
Генерация 4: 0 10
Генерация 5: уже ничего не будет генерировать

Если к 9ой генерации чисел из диапазона уже не останется то результата не будет, и нужно делать сброс чтобы начать с начала

рони 28.09.2017 20:05

Samik,
<script>
function gn(b, d, c) {
    for (var a = []; b <= d; b++) a = a.concat(a.splice(Math.random() * a.length | 0, 1, b));
    return function() {
        return a.length >= c ? a.splice(a.length - c) : a.splice(0)
    }
};
var x = gn(0,10,3)
for (var i=0; i<5; i++)  {document.write(x()+"<br>")}

  </script>

Samik 28.09.2017 21:00

Цитата:

Сообщение от рони (Сообщение 465890)
Samik,
<script>
function gn(b, d, c) {
    for (var a = []; b <= d; b++) a = a.concat(a.splice(Math.random() * a.length | 0, 1, b));
    return function() {
        return a.length >= c ? a.splice(a.length - c) : a.splice(0)
    }
};
var x = gn(0,10,3)
for (var i=0; i<5; i++)  {document.write(x()+"<br>")}

  </script>

тестирую, а можно это обернуть так?

j0hnik 28.09.2017 21:16

<!DOCTYPE html>
<html lang="en">
<head>
	<style>
		input{
			width: 30px;
		}
	</style>
</head>
<body>
	От <input type="text" value="0" id="ot"> до <input type="text" value="10" id="do"> по <input type="text" value="3" id="num"> чисел<br>
	<button id="gen">Генерировать</button><button id="sb">Сброс</button>
	<div id="res"></div>

	<script>
		function gn(b, d, c) {
			for (var a = []; b <= d; b++) a = a.concat(a.splice(Math.random() * a.length | 0, 1, b));
				return function() {
					return a.length >= c ? a.splice(a.length - c) : a.splice(0);
				};
			}
			function sm(){
				var x = gn(document.querySelector('#ot').value,document.querySelector('#do').value,document.querySelector('#num').value);
				document.querySelector('#gen').onclick = function(){
					document.querySelector('#res').innerHTML += x()+"<br>";
				};
				document.querySelector('#res').innerHTML='';
			};
			sm();
			document.querySelector('#sb').onclick=sm;
		</script>
	</body>
	</html>


Часовой пояс GMT +3, время: 13:20.