Как я могу производить случайные числа, которые не повторялись бы?

Я сделал один array или я упорядочиваю, чтобы иметь 5 типов стоимости.

Просто я хочу, чтобы они оказались случайными с одним random math... но. деталь состоит в том, что он иногда перемещает, что повторяет ту же стоимость 1, даже 3 раза продолженный, я это не хочу. Пример:

В договоренности говорит 12345. когда он работает, выходит 11 потом 4 3 5....., но 1 повторился два раза продолженные: Как я могу делать ему для того, чтобы он это не переместил?

19
задан 27.12.2016, 21:26
8 ответов

Это способ получать nГєmeros случайные без того, чтобы они повторились начиная с определенного array, в этом случае как примере 5 типов стоимости.

var myArray = ['1','2','3','4','5'];

    var i,j,k;
    for (i = myArray.length; i; i--) {
        j = Math.floor(Math.random() * i);
        k = myArray[i - 1];
        myArray[i - 1] = myArray[j];
        myArray[j] = k;
    }


document.write("números aleatorios : " + myArray);

Это форма, чтобы получать nГєmeros случайные без того, чтобы они повторились, что ты должен реализовывать, состоит в том, чтобы получать один nГєmero случайный в определенном ранге и проверять не повторилось храня в array, примере получая nГєmeros случайные в ранге от 1 до 5:

//Define la cantidad de numeros aleatorios.
var cantidadNumeros = 5;
var myArray = []
while(myArray.length < cantidadNumeros ){
  var numeroAleatorio = Math.ceil(Math.random()*cantidadNumeros);
  var existe = false;
  for(var i=0;i<myArray.length;i++){
	if(myArray [i] == numeroAleatorio){
        existe = true;
        break;
    }
  }
  if(!existe){
    myArray[myArray.length] = numeroAleatorio;
  }

}
document.write("números aleatorios : " + myArray);
7
ответ дан 24.11.2019, 13:08

То, что я думаю, чем array [1,2,3,4,5], снимать элемент 1, и помещать это в случайное положение второго array, тогда остается [1].

Потом 2, и помещать это случайным образом, и смоги оставаться [2,1] или [1,2]. Если он [2,1], потом 3, смоги оставаться [3,2,1], [2,3,1] или [2,1,3]. Если он [2,1,3], потом 4, тогда [4,2,1,3] [2,4,1,3] [2,1,4,3] [2,1,3,4]. Если он [2,4,1,3].

В конце концов, 5 смоги быть введенным в каком-то месте, оставаясь этими возможными arrays.

[5,2,4,1,3]
[2,5,4,1,3]
[2,4,5,1,3]
[2,4,1,5,3]
[2,4,1,3,5]

Предполагая, что он был введен в четвертом положении, вытекающий array [2,4,1,5,3]. Matemáticamente, возможные arrays для x - x! а именно, factorial x, а именно, для 5 это 120 возможностей, в то время как, если повторяются числа, он xx, а именно, для 5 это 3125 возможностей.

Код:

function insertarEn(array,valor,posición)
{
	var inicio=array.slice(0,posición)
	var medio=valor
	var fin=array.slice(posición)
	var resultado=inicio.concat(medio).concat(fin)
	return resultado
}
function aleatoriosNoRepetidos(cantidad)
{
	var array=[]
	for(var i=0;i<cantidad;i++)
	{
		array=insertarEn(array,i,Math.random()*(cantidad+1) )
	}
	return array
}
console.log( aleatoriosNoRepetidos(5)+"" )
5
ответ дан 24.11.2019, 13:08

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

В следующем коде я показываю тебе, как создавать функцию, параметр которой - список.

Этот список "тасуется" в цикле for, (закончив цикл for, элементы будут приведены в беспорядок случайным образом).

Однажды сделанный это, функция возвращает другую функцию, которая возьмется за то, чтобы давать тебе случайное число, отличное от этого списка в каждом вызове, кругового способа (когда он возвратит тебе все те, кто у него есть, не повторяя, он вновь начнет давать их тебе в том же предварительном порядке).

var randomFromListGenerator = function (list) {
    var position = 0;

    for (var i=0, l=list.length; i<l; i++) {
        var random = Math.floor((Math.random() * l));
        var aux = list[i];
        list[i] = list[random];
        list[random] = aux;
    }

    return function () {
        return list[position++ % list.length];
    }
}

Чтобы использовать эту функцию только ты должен делать следующее:

var nextRandomFromList = randomFromListGenerator ([1,2,3,4,5]);

И когда ты захочешь новое случайное число делать:

var newRandom = nextRandomFromList();

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

4
ответ дан 24.11.2019, 13:08

Это простой способ наполнять договоренность с nГєmeros случайные, с переменными для parametrizar то, в чем ты нуждаешься.

var arr = []; // Arreglo para llenar
var cantidadNumeros = 5; // Cantidad de números en el arreglo
var hasta = 10; // Máximo valor de los números en el arreglo

function llenarAleatorios(a){
    var v = Math.floor(Math.random() * hasta);
    if(!a.some(function(e){return e == v})){
        /** 
         * Si no se encuentra el valor aleatorio en el arreglo
         * se pushea el valor.
         */ 
        a.push(v);
    }
}
/**
 * Bucle para llenar el arreglo con la cantidad que necesites
 */
while(arr.length < cantidadNumeros && cantidadNumeros < hasta){
    llenarAleatorios(arr);
}

После этого, tenes твоя договоренность, полная nГєmeros случайные не повторенные .

4
ответ дан 24.11.2019, 13:08

Я ответил сходный вопрос в другом трэде:
Извлекать 4 Strings random Array в языке сценариев JavaScript
Идея состоит в том, чтобы хранить уже появившиеся числа и выбирать числа остальных.
EDIT:
Пример функции, ты вводишь минимум и максимум, и выбери числа случайным образом до тех пор, пока не заканчиваются выборы, если включается reset, resetea список, если меняется ранг также.

	function numAleatorioSinRepetir(minimo,maximo) {
		var i;
		if (minimo=="reset"){	// Si el primer parámetro es "reset", reinicia la lista de números y sale.
			if (!this.minimo||!this.maximo) return; // Si el rango no está definido, sale.
			this.numerosAparecidos=[]; // reinicia matriz
			for (i=this.minimo;i<=this.maximo;i++)
				this.numerosAparecidos.push(i); // Introduce los números del rango.
			return;
		}
		if (isNaN(minimo)||isNaN(maximo)) return; // Si los parámetros no son números, sale.

		if (minimo!=this.minimo || maximo!=this.maximo){ // Si cambia el rango, resetea la lista de numeros.
			if (minimo>maximo) { // Si el mínimo es mayor que el máximo, invierte las variables.
				i=minimo;
				minimo=maximo;
				maximo=i;
			}
			this.minimo=minimo; // Guarda el nuevo rango
			this.maximo=maximo;
			this.numerosAparecidos=[]; // reinicia matriz
			for (i=minimo;i<=maximo;i++)
				this.numerosAparecidos.push(i); // Introduce los números del rango.
		}
		var random=Math.floor(Math.random()*this.numerosAparecidos.length); // Elije una posicion aleatoria
		var numero=this.numerosAparecidos[random]; // Guarda el número de la posición.
		this.numerosAparecidos.splice(random,1); // Elimina la posición.
		return numero; // Devuelve el número.
	}
	function ponNumero(){
		var min=parseInt(IDmin.value);
		var max=parseInt(IDmax.value);
		var numero=numAleatorioSinRepetir(min,max);
		IDinfo.innerHTML+=numero+", ";
	}
Mínimo:<input id="IDmin"> Máximo:<input id="IDmax"> <button onclick="numAleatorioSinRepetir('reset')">Reset</button>
<button onclick="ponNumero()">Pon numero</button>
<DIV id="IDinfo"></DIV>
4
ответ дан 24.11.2019, 13:08
  • 1
    @ArnauCastellv и # 237; привет, комментарий это помещает autom и # 225; ticamente revisi и # 243; n, в любом случае всегда хорошо оставлять пример поэтому revis и # 233; твой publicaci и # 243; n. схвати и # 237; остается все в этом вопросе, если другую удалено ты оставаться и # 237; в неполную, спасибо за добавление elejemplo! – Alan 13.10.2016, 16:14
  • 2
    @ArnauCastellv и # 237; t и # 243; такой дьявол как подсказка я не стараюсь говорить, что плохой ответ, он больше мне кажется хорошим, одиноким звуком cr и # 237; костариканские конструктивные:), +1 – Alan 13.10.2016, 16:15

Доставший из SO ENG: https://stackoverflow.com / в / 6274381/3045491

mГ©todo "тасует" это тебе, реорганизует элементы.

function shuffle(a) {
    var j, x, i;
    for (i = a.length; i; i--) {
        j = Math.floor(Math.random() * i);
        x = a[i - 1];
        a[i - 1] = a[j];
        a[j] = x;
    }
}
3
ответ дан 24.11.2019, 13:08
  • 1
    спасибо, я попробую добавлять это к моему коду, посмотрим тяни, я не понимаю хорошо эту логику lois6 – Memo333 11.10.2016, 18:30
  • 2
    дело в том, что без в и # 241; adir t и # 250; твой код... вещь состоит в том, что, если в твой код ты оказываешься 5 случайных чисел вовлеченными, они будут выходить у тебя повторенными. в и # 241; ade array, где ты поместил тех, которых ты выбирал, чтобы подтверждать, что они не были выбраны уже – lois6b♦ 11.10.2016, 18:33
  • 3
    Титул вопроса говорит " ¿ Có mo я могу производить nú случайные морские окуни, которые не повторялись бы? ". Этот ответ не производит nú морские окуни. – Marcos 27.12.2016, 21:38
  • 4
    @MarcosGallardo вопрос начинается с " Я сделал array или договоренность, чтобы иметь 5 valores.". Из-за которого кажется OP, захоти переместить array со стоимостью в " randomizar" – lois6b♦ 03.01.2017, 09:11
  • 5
    Это: " , чтобы иметь 5 типов стоимости " сложенный в титул, возможно понимать как: закончив script захоти иметь 5 типов стоимости . – Marcos 03.01.2017, 15:39

Первый создай список с количеством числа, которое ты желаешь.

Lis<Integer> numbers = new ArrayList<>();
                for (int i = 0; i < cantidad_que_quieres; i++) {
                    numbers.add(i);
                }

Потом ты помещаешь его shuffle.

                Collections.shuffle(numbers);

И потом ты это пробегаешь (и он будет приведен в беспорядок благодаря shuffle). А именно, что, если в i <tu_variable ты поместил 10, у тебя будет 10 неряшливых чисел.

И потом ты просишь ранг чисел, которые ты хочешь. Что я имею в виду? Чего в пределе наверху может быть 100, потому что, хотя ты захочешь показать в конце концов 3 в общем количестве, ты не хотел, чтобы он также ограничился 3 случайными. Наверху ты определяешь, сколькие ты хочешь и здесь внизу ты определяешь, сколькие ты покажешь, и в каком ранге. Если ты хочешь инициализироваться с 1, j=1, и я схватил.

    for(int j=0;j<total_rango;j++){
 //Muestras el indice j, que será aleatorio y no se repetirá
}
0
ответ дан 24.11.2019, 13:08
  • 1
    весь этот код онлайновый? у меня есть ke помещать что-то в for?? – Memo333 12.10.2016, 18:42
  • 2
    for est и # 225; n отделенные. Чтобы показывать тогда ты помещаешь print (numbers.get [j]) и появляться и # 225; и #237; ndice numbers (который он содержит n и # 250; неряшливые и не повторенные морские окуни), в котором j est и # 233; в момент. – Jonny 12.10.2016, 18:52
  • 3
    @Jonny вопрос est и # 225; приклеенная этикетку как [javascript] (И язык сценариев JavaScript не Java). – Mariano 13.10.2016, 17:08

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

Я приступил к проблеме со следующей точки зрения:

1) максимальная стоимость random должна будет быть равна количеству числа количеству попросивших чисел для того, чтобы имело смысл поколение и не оставалось без чисел.

2) производит случайную стоимость и создается договоренность так называемый "array".

3) сравнивает стоимость договоренности с произведенным числом, если он не существует, он присоединяется.

4) заканчивает цикл с количеством попросивших чисел Array (4) [0, 4, 3, 1]

5) создается пустая договоренность с количеством попросивших чисел договоренность называется "foo"

6) вводятся в договоренности "foo" числа, произведенные и хранившиеся договоренностью "array' deacuerdo в Вашу стоимость и положение в индексе оставаясь неопределенные будки. Пример: Array (5) [0, 1, < 1 empty slot>, 3, 4]

7) делает себе поездку из-за договоренности "foo", чтобы искать будку неопределенные и тех, которые находят, вводит как стоимость расположенное напротив положение, оставаясь конечная договоренность этой формы. Array (5) [0, 4, 3, 1, 2]

Замечает: он не начал производить random каждый раз, когда он находил повторенное число, потому что это в конце концов тратит цикл процесса и даже может входить в неопределенный цикл после того, как старается производить число, которое возможно не выходило бы в random.

ПРИСОЕДИНИЛ КОД:

// declaracion de variables
   var veces = 5;
   var max = veces;

    var array =[];
    for(var l=0; l< veces; l++) {          
            var randomNumber = Math.floor(Math.random()*max); 
                 var repite=false;
                // busca la lista de numeros generados
                array.forEach(function(element) {
                     // si hay un numero repetido  = TRUE
                     if (element==randomNumber) {
                        repite=true;
                        }
                });           
                // si no se repite ningun numero = FALSE
                if (repite==false) {
                    array.push(randomNumber)
                }       
    }

    
    console.log(array); // valor de arreglo array

    // crear array por numero de veces
    var foo = new Array(veces);    
    array.forEach(function(element) {
        foo[element]= element;
    });
    console.log(foo); // arreglo foo

    // buscar campo indefinidos para completar 
    for (let index = 0; index < foo.length; index++) {
       console.log(foo[index]);
       if (foo[index]=== undefined) {
         console.log('indefinido valor');
         array.push(index);
       }
    }
    
    console.log(array); // resultado de arreglo;

    // mostrar valor en mensaje
    array.forEach(function(element) {
        document.writeln(element)
    });   
0
ответ дан 24.11.2019, 13:08

Следующим может быть хорошее начало для тебя:

Ты определяешь один array с элементами, которые ты хочешь получить случайным способом и определяешь переменную, которая будет содержать последнюю полученную стоимость, хотя он изначально не будет считать присоединенной никакой стоимости.

Потом ты звонишь в функцию getRandomFromArrayNotRepeated происходя с ним, как я доказываю array в выбор. Та же самая Будет искать случайную стоимость array и он это сравнит с последней стоимостью, распределенной в lastRandomValue. Если стоимость совпадает, будет работать снова функция getRandomFromArrayNotRepeated, в случае когда он не совпадал он распределит новую стоимость в lastRandomValue и он возвратит вышеупомянутую стоимость.

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

var lastRandomValue, exampleArray = [1,2,3,4,5];

function getRandomFromArrayNotRepeated(array) {
   var item = array[Math.floor(Math.random()*array.length)];
   if(lastRandomValue === item && array.length > 1) {
       return getRandomFromArrayNotRepeated(array, item);
   } 
   return lastRandomValue = item;
}

for(var i = 0, len = 100; i < len; i++) {
    console.log(getRandomFromArrayNotRepeated(exampleArray));
}

Если то, что ты в действительности хочешь сделать, состоит в том, чтобы делать каждую случайную единственную стоимость (мочь получать эту стоимость только однажды), я рекомендую Тебе продолжать это решение: Generating нечетное число - repeating random numbers in JS

4
ответ дан 03.12.2019, 20:00

Теги

Похожие вопросы