Foros del Web » Programando para Internet » PHP »

Meter en array numeros aleatorios sin repetir

Estas en el tema de Meter en array numeros aleatorios sin repetir en el foro de PHP en Foros del Web. Hola, estoy intentando hacer un código en que se vayan generando números aleatorios y me los guarde un array, pero sin repetir lo números. Esto ...
  #1 (permalink)  
Antiguo 31/08/2011, 09:30
 
Fecha de Ingreso: mayo-2010
Mensajes: 128
Antigüedad: 14 años
Puntos: 13
Meter en array numeros aleatorios sin repetir

Hola, estoy intentando hacer un código en que se vayan generando números aleatorios y me los guarde un array, pero sin repetir lo números.
Esto es lo que he hecho:

Código PHP:
$max=9;
$aleatorio=mt_rand(1,$max); //Genereamos aleatorio
    
$usados[]=$aleatorio//Guardamos el primero en un array ya que el primero no puede estar repetido
    
    
    
for ($i=0$i<6$i++)
    {
    
$aleatorio=mt_rand(1,$max); //Generamos aleatorio
    
echo $usados[$i];
        
        
$contador=0;
        for (
$n=$contador$n<count($usados)+1$n++) //Recorre desde el comienzo hasta el final del array
        
{    
        
            while (
$aleatorio==$usados[$n]) //Si se repiten generamos el aleatorio y ponemos reiniciamos el contador para que vuelva a comprobar en el for
            
{    
            
$aleatorio=mt_rand(1,$max);
            
$contador=0;
            }
            
        }    
        
        
    
$usados[]=$aleatorio;    //No esta repetido, luego guardamos el aleatorio
    

El caso es que aunque no repite tanto como dejando usando solo la función rand y guardando si que a veces me repite algún número. Creo que el error esta en que no reinicia el contador después del while con lo cual no vuelve a comprobar todos los números del array.
  #2 (permalink)  
Antiguo 31/08/2011, 09:39
Colaborador
 
Fecha de Ingreso: octubre-2009
Ubicación: Tokyo - Japan !
Mensajes: 3.867
Antigüedad: 14 años, 6 meses
Puntos: 334
Respuesta: Meter en array numeros aleatorios sin repetir

un algoritmo mas simple podria ser

Código PHP:
<?php 
$rand 
range(140); 
shuffle($rand); 
foreach (
$rand as $val) { 
    echo 
$val '<br />'
}
estúdialo haber si te sirve para que tengas una idea..

saludos.

www.php.net/range
www.php.net/shuffle
__________________
More about me...
~ @rhyudek1
~ Github
  #3 (permalink)  
Antiguo 31/08/2011, 09:43
Avatar de h2swider  
Fecha de Ingreso: julio-2007
Ubicación: Ciudad de Buenos Aires
Mensajes: 932
Antigüedad: 16 años, 9 meses
Puntos: 194
Respuesta: Meter en array numeros aleatorios sin repetir

Una posible solucion seria usando in_array();

http://ar2.php.net/manual/es/function.in-array.php

Código PHP:
<?php

$max 
9;
$aleatorio mt_rand(1$max); //Genereamos aleatorio
$usados[] = $aleatorio//Guardamos el primero en un array ya que el primero no puede estar repetido

for ($i 0$i 6$i++) {
    
    
$aleatorio mt_rand(1$max); //Generamos aleatorio
    
while(in_array($aleatorio,$usados)) { //buscamos que no este repetido
        
$aleatorio mt_rand(1$max);
    }

    
$usados[] = $aleatorio;    //No esta repetido, luego guardamos el aleatorio
}
?>
__________________
Codifica siempre como si la persona que finalmente mantedra tu código sea un psicópata violento que sabe donde vives
  #4 (permalink)  
Antiguo 31/08/2011, 09:44
 
Fecha de Ingreso: febrero-2010
Mensajes: 818
Antigüedad: 14 años, 2 meses
Puntos: 55
Respuesta: Meter en array numeros aleatorios sin repetir

creo que la respuesta de Hidek1 es lo mas optimo, pero para saber si un valor se repite puede usar la funcion in_array()

saludos.
  #5 (permalink)  
Antiguo 31/08/2011, 09:47
Avatar de h2swider  
Fecha de Ingreso: julio-2007
Ubicación: Ciudad de Buenos Aires
Mensajes: 932
Antigüedad: 16 años, 9 meses
Puntos: 194
Respuesta: Meter en array numeros aleatorios sin repetir

Cita:
Iniciado por Death_Empire Ver Mensaje
creo que la respuesta de Hidek1 es lo mas optimo, pero para saber si un valor se repite puede usar la funcion in_array()

saludos.
Opino igual la respuesta de Hidek1 es la mas eficiente sin lugar a dudas.

Solo di un ejemplo siguiendo la estructura del algoritmo que venia manejando anteriormente.

Saaludos!
__________________
Codifica siempre como si la persona que finalmente mantedra tu código sea un psicópata violento que sabe donde vives
  #6 (permalink)  
Antiguo 31/08/2011, 10:03
 
Fecha de Ingreso: mayo-2010
Mensajes: 128
Antigüedad: 14 años
Puntos: 13
Respuesta: Meter en array numeros aleatorios sin repetir

Gracias por responder, no conocía la función in_array. ¿Se os ocurre algún modo de hacerlo sin usar funciones predefinidas?
  #7 (permalink)  
Antiguo 31/08/2011, 10:17
 
Fecha de Ingreso: mayo-2010
Mensajes: 128
Antigüedad: 14 años
Puntos: 13
Respuesta: Meter en array numeros aleatorios sin repetir

Por cierto, he probado el in_array y me entra en un bucle infinito:

while(in_array($aleatorio,$usados)) { //buscamos que no este repetido
$aleatorio = mt_rand(1, $max);
}
  #8 (permalink)  
Antiguo 31/08/2011, 10:20
Avatar de vgonga1986  
Fecha de Ingreso: marzo-2008
Ubicación: País de Pandereta
Mensajes: 1.021
Antigüedad: 16 años, 1 mes
Puntos: 253
Respuesta: Meter en array numeros aleatorios sin repetir

Qué valores de $max tienes y cuál es el límite de tu for, es decir, número de posiciones del array? Si el array tiene más posiciones del número que has definido para $max, llega un momento en que ningún entero que genere le vale, porque ya todos están en el array.

Un saludo.
__________________
¿Alguna pregunta, duda, acotación, nota, cuestión, reparo, comentario, demanda, crítica, interpretación, objeción, interrogante, discrepancia, observación, réplica, disquisición, apostilla o exégesis?
  #9 (permalink)  
Antiguo 31/08/2011, 10:34
Avatar de Ronruby  
Fecha de Ingreso: julio-2008
Ubicación: 18°30'N, 69°59'W
Mensajes: 4.879
Antigüedad: 15 años, 9 meses
Puntos: 416
Respuesta: Meter en array numeros aleatorios sin repetir

Cita:
Iniciado por mitrofan Ver Mensaje
Por cierto, he probado el in_array y me entra en un bucle infinito:

while(in_array($aleatorio,$usados)) { //buscamos que no este repetido
$aleatorio = mt_rand(1, $max);
}
Claro que entrara en un bucle infinito. Estas diciendo que mientras X elemento se encuentre en el array que siga corriendo. Si da true la primera vez, seguira evaluando como true hasta el final de los tiempos
  #10 (permalink)  
Antiguo 31/08/2011, 10:41
Avatar de h2swider  
Fecha de Ingreso: julio-2007
Ubicación: Ciudad de Buenos Aires
Mensajes: 932
Antigüedad: 16 años, 9 meses
Puntos: 194
Respuesta: Meter en array numeros aleatorios sin repetir

Cita:
Iniciado por Ronruby Ver Mensaje
Claro que entrara en un bucle infinito. Estas diciendo que mientras X elemento se encuentre en el array que siga corriendo. Si da true la primera vez, seguira evaluando como true hasta el final de los tiempos
No, porque luego dentro del while cambio el X elemento por uno nuevo, en el momento que el nuevo X no este en el array no entra mas.

Se me esta escapando algo?
__________________
Codifica siempre como si la persona que finalmente mantedra tu código sea un psicópata violento que sabe donde vives
  #11 (permalink)  
Antiguo 31/08/2011, 10:41
Avatar de quike88  
Fecha de Ingreso: agosto-2008
Mensajes: 471
Antigüedad: 15 años, 8 meses
Puntos: 87
Respuesta: Meter en array numeros aleatorios sin repetir

Para generar números aleatorios sin usar funciones de php, tendrías que usar algún método para generar números pseudo aleatorios, como el congruencial lineal o mixto.

Aquí tengo un ejemplo del congruencial mixto:

Código PHP:
<?php
//Semillas
$x 1;
$a 19;
$c 7;
$m 23;
//Fórmula Xn=(aXn-1+c) (mod M)
$aleatorio fmod(($a*$x+$c), $m);
$rnd[] = $aleatorio;
for (
$i 1$i $m-1$i++) {
    
$aleatorio fmod(($a*$aleatorio+$c), $m);
    
$rnd[] = $aleatorio;
}
echo 
'<pre>';
print_r($rnd);
echo 
'</pre>';
Las semillas deben ser números primos, y M siempre debe ser mayor.

Saludos
  #12 (permalink)  
Antiguo 31/08/2011, 10:59
 
Fecha de Ingreso: mayo-2010
Mensajes: 128
Antigüedad: 14 años
Puntos: 13
Respuesta: Meter en array numeros aleatorios sin repetir

Perdón hs2wider, vgonga1986 tiene la razón, el max he probado era de 6 y el indice lo tenían en $i<6, si lo pongo en $i<5 si lo pilla.

Gracias quike88, en realidad lo que me gustaría es terminarlo como lo he empezado, usando solo la función rand, pero si no sale pues lo haré usando in_array o el otro método de Hiderk1 que usa otras dos funciones.
  #13 (permalink)  
Antiguo 31/08/2011, 11:09
Avatar de h2swider  
Fecha de Ingreso: julio-2007
Ubicación: Ciudad de Buenos Aires
Mensajes: 932
Antigüedad: 16 años, 9 meses
Puntos: 194
Respuesta: Meter en array numeros aleatorios sin repetir

El algoritmo sin in_array seria algo asi:

Código PHP:
<?php

$max 
9;
$aleatorio mt_rand(1$max); //Genereamos aleatorio

for ($i 0$i 5$i++) {

    
$aleatorio mt_rand(1$max); //Generamos aleatorio
    
for ($j 0$j $i$j++) { 
        
/*buscamos que no este repetido,
         si esta repetido genero otro aleatorio y empiezo de 0 
        previniendo el $j++ */
        
if($usados[$j] == $aleatorio){ 
            
$aleatorio mt_rand(1$max);
            
$j=-1;
        }
    }

    
$usados[] = $aleatorio;    //No esta repetido, luego guardamos el aleatorio
}

var_dump($usados);
?>
Eso es lo que buscabas?
__________________
Codifica siempre como si la persona que finalmente mantedra tu código sea un psicópata violento que sabe donde vives
  #14 (permalink)  
Antiguo 31/08/2011, 11:33
 
Fecha de Ingreso: mayo-2010
Mensajes: 128
Antigüedad: 14 años
Puntos: 13
Respuesta: Meter en array numeros aleatorios sin repetir

Esta muy bien, gracias. Luego lo pruebo.

Etiquetas: numeros, repetir, aleatoria
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 07:48.