Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Ramdom que no se repita

Estas en el tema de Ramdom que no se repita en el foro de PHP en Foros del Web. Buenas, Tengo este for php. Genera un ramdom. @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código PHP: Ver original for ( $i = 0 ; $i < mysql_num_rows ( $query ...
  #1 (permalink)  
Antiguo 03/07/2013, 08:32
 
Fecha de Ingreso: junio-2011
Mensajes: 342
Antigüedad: 12 años, 9 meses
Puntos: 5
Exclamación Ramdom que no se repita

Buenas,

Tengo este for php. Genera un ramdom.

Código PHP:
Ver original
  1. for($i = 0; $i < mysql_num_rows($query); $i++){
  2.             $ramdom = rand(000, 999);
  3. }

Lo que quiero es que en todo lo que ejecuta el for el número que da de resultado el ramdom no se repita.
  #2 (permalink)  
Antiguo 03/07/2013, 08:33
Avatar de pzin
Moderata 😈
 
Fecha de Ingreso: julio-2002
Ubicación: Islas Canarias
Mensajes: 10.488
Antigüedad: 21 años, 8 meses
Puntos: 2114
Respuesta: Ramdom que no se repita

Pues simplemente declara la variable fuera del bucle, ¿no? Dudo de hasta si entendí bien.
  #3 (permalink)  
Antiguo 03/07/2013, 08:33
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Ramdom que no se repita

Necesitas ir almacenando el valor de $random en un array, y debes ir comprobando con in_array() que dicho valor no exista previamente.

A esa técnica se le conoce como Memoization (memorización), te sugiero investigar al respecto.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #4 (permalink)  
Antiguo 03/07/2013, 08:56
Avatar de pzin
Moderata 😈
 
Fecha de Ingreso: julio-2002
Ubicación: Islas Canarias
Mensajes: 10.488
Antigüedad: 21 años, 8 meses
Puntos: 2114
Respuesta: Ramdom que no se repita

Vaya, había leido que se repitiera.
  #5 (permalink)  
Antiguo 03/07/2013, 09:06
 
Fecha de Ingreso: junio-2011
Mensajes: 342
Antigüedad: 12 años, 9 meses
Puntos: 5
Exclamación Respuesta: Ramdom que no se repita

Umm,

Poniendo esto dentro del bucle valdría??

Código PHP:
Ver original
  1. $randomValues = range(0, 999);
  2. shuffle($randomValues);
  3. print_r($randomValues);

Y haciendo esto??

Código PHP:
Ver original
  1. $values = array();
  2. for($x=1;$x<=999;$x++) {
  3.     $values[$x] = $x;
  4. }
  5. $counter = 999;
  6. for($i = 0; $i < mysql_num_rows($query); $i++){
  7.     $rand_num = rand(1,$counter);
  8.     $current_number = $values[$rand_num];
  9.     array_splice($values, $rand_num, 1);
  10.     $counter--;
  11.     echo "rand number: " . $current_number . '<br>';
  12. }
  #6 (permalink)  
Antiguo 03/07/2013, 09:18
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: Ramdom que no se repita

Si solo te interesa generar un identificador aleatorio y no te importa sea alfanumerico o numerico...

Código PHP:
<?php

for ($i=0;$i<1000;$i++)
    echo 
uniqid(null,true).' ';

uniqid() hace un hash al momento actual en microsegundos y adicional lo puedes randomizar un poco con True de segundo parametro
__________________
Salu2!
  #7 (permalink)  
Antiguo 03/07/2013, 09:50
 
Fecha de Ingreso: junio-2011
Mensajes: 342
Antigüedad: 12 años, 9 meses
Puntos: 5
Exclamación Respuesta: Ramdom que no se repita

Cita:
Iniciado por Italico76 Ver Mensaje
Si solo te interesa generar un identificador aleatorio y no te importa sea alfanumerico o numerico...

Código PHP:
<?php

for ($i=0;$i<1000;$i++)
    echo 
uniqid(null,true).' ';

uniqid() hace un hash al momento actual en microsegundos y adicional lo puedes randomizar un poco con True de segundo parametro
Pero tiene que ser un númerico de 3 cifras.
  #8 (permalink)  
Antiguo 03/07/2013, 09:58
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Ramdom que no se repita

Cita:
Iniciado por carlosuc99 Ver Mensaje
Pero tiene que ser un númerico de 3 cifras.
Bueno, ya, en serio, ¿esperas que te demos el código a la medida?

Por favor, no alimenten con fragmentos de código si la intención no es ayudar a buscar una solución por uno mismo.

La idea es que carlosuc99 aprenda a resolver esto por su cuenta, pero por mas que miro no tiene intenciones de aprender, sólo esta esperando a que la divina solución caiga del cielo.

Sólo responde para decir que no le sirve, pero tampoco muestra lo que ya ha hecho, no consientan a los vagos.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #9 (permalink)  
Antiguo 03/07/2013, 10:11
 
Fecha de Ingreso: junio-2011
Mensajes: 342
Antigüedad: 12 años, 9 meses
Puntos: 5
Respuesta: Ramdom que no se repita

Cita:
Iniciado por pateketrueke Ver Mensaje
Bueno, ya, en serio, ¿esperas que te demos el código a la medida?

Por favor, no alimenten con fragmentos de código si la intención no es ayudar a buscar una solución por uno mismo.

La idea es que carlosuc99 aprenda a resolver esto por su cuenta, pero por mas que miro no tiene intenciones de aprender, sólo esta esperando a que la divina solución caiga del cielo.

Sólo responde para decir que no le sirve, pero tampoco muestra lo que ya ha hecho, no consientan a los vagos.
Perdona????

Ya he mostrado lo que ya he hecho, y lo tienes dos mensajes arriba.

Código PHP:
Ver original
  1. $values = array();
  2. for($x=1;$x<=999;$x++) {
  3.     $values[$x] = $x;
  4. }
  5. $counter = 999;
  6. for($i = 0; $i < mysql_num_rows($query); $i++){
  7.     $rand_num = rand(1,$counter);
  8.     $current_number = $values[$rand_num];
  9.     array_splice($values, $rand_num, 1);
  10.     $counter--;
  11.     echo "rand number: " . $current_number . '<br>';
  12. }

Y esto código es totalmente válido, o por lo menos en las pruebas que he hecho las ha pasado.

Le he dicho al compañero que tenía que ser númerico porque el dijo:
Cita:
Si solo te interesa generar un identificador aleatorio y no te importa sea alfanumerico o numerico...
Claramente te has equivocado amigo, y espero que te disculpes.

PD: De hecho edito esto, porque he encontrado una solución mejor:

Código PHP:
Ver original
  1. $max_value = 999;
  2. $values = range(0, $max_value);
  3. $counter = $max_value;
  4. $num_rows = mysql_num_rows($query); //Muevo esto fuera del bucle para que no se recalcules seguido.
  5. for($i = 0; $i < $num_rows; $i++){
  6.     $rand_num = rand(0,$counter);
  7.     $current_number = $values[$rand_num];
  8.     array_splice($values, $rand_num, 1);
  9.     $counter--;
  10.     echo "rand number: " . $current_number . '<br>';
  11. }
  #10 (permalink)  
Antiguo 03/07/2013, 10:16
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Ramdom que no se repita

Bueno, y si ya tienes código válido y que te funciona, ¿por qué aún no marcas como solucionado el tema?

A menos que nos indiques si tienes problemas no podemos hacer nada más, entiende que no se puede leer tu mente y saber si lo que tienes te ha funcionado o no.

El colmo sería que si todavía no resuelves tu problema no digas nada y te quedes callado, únicamente negando posibles soluciones, sin indicarnos tu avance ni nada, tu dirás.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #11 (permalink)  
Antiguo 03/07/2013, 10:18
 
Fecha de Ingreso: junio-2011
Mensajes: 342
Antigüedad: 12 años, 9 meses
Puntos: 5
Exclamación Respuesta: Ramdom que no se repita

Cita:
Iniciado por pateketrueke Ver Mensaje
Bueno, y si ya tienes código válido y que te funciona, ¿por qué aún no marcas como solucionado el tema?

A menos que nos indiques si tienes problemas no podemos hacer nada más, entiende que no se puede leer tu mente y saber si lo que tienes te ha funcionado o no.

El colmo sería que si todavía no resuelves tu problema no digas nada y te quedes callado, únicamente negando posibles soluciones, sin indicarnos tu avance ni nada, tu dirás.
La culpa siempre la tiene la otra persona. Reconoce que te has equivocado. Podría haber marcado el tema como solucionado si, ahi fallé yo. Pero tu no tenias que haber dicho nada, y menos decir que soy un vago, cuando la solución la di yo dos mensajes más arriba.
  #12 (permalink)  
Antiguo 03/07/2013, 10:24
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Ramdom que no se repita

Pues dicho código que tienes como "válido" si puede fallar, ya que al obtener el índice por azar puede que eventualmente te de el mismo índice.

Una forma infalible sería así:
Código PHP:
Ver original
  1. $nums = range(0, 999);
  2. shuffle($nums);
  3.  
  4. while (/* ... */) {
  5.   $rand_num = array_shift($nums);
  6. }

PDTA: y no te dije vago, hablé en general, si te quedó el saco ya no es mi culpa.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.

Etiquetas: mysql
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 09:13.