La función para generar aleatorios es mt_rand($min,$max). Si no se especifica min/max entregará un N° entre 1 y
2.147.483.647 si min>max devuelve error. por eso antes de dispararla se debe controlar max y min.
Para generar los N aleatorios usamos un bucle
for(), en él generamos el aleatorio y lo
introducimos incondicionalmente en el array.
En el que no se repiten usamos un bucle
while() y antes de introducir el aleatorio en el bucle
con un
in_array() vemos si está ya cargado.
Obviamente necesitamos que max-min sea al menos el número N de aleatorios que deseamos, si no vamos a tener
un bucle infinito ya que siempre va a encontrar alguno repetido.
Si deseamos N números consecutivos desordenados aleatoriamente puede ser más conveniente usar .
shuffle(array) ver
<head>
//validar min,max para que mt_rand() no de error
$valores01=array();
$valores02=array();
if (isset( $_POST["maxmin"])){
if (strlen( $_POST["min"])>0){ //me asegura un min
$min=$_POST["min"];
}else{
$min=1;
}
if (strlen( $_POST["max"])>0){ //me asegura un max
$max=$_POST["max"];
}else{
$max=10;
}
if ($min>=$max){ // max>min o los intercambio
$temp=$min;
$min=$max;
$max=$temp;
}
// carga los 10 aleatorios con repeticiones permitidas
$valores01=array();
for($i=0;$i<10;$i++){
$aleatorio=mt_rand($min,$max);
array_push($valores01,$aleatorio);
}
// carga los 10 aleatorios con repeticiones no permitidas
$valores02=array();
if (($max-$min<9)){ //necesito al menos 10 valores
array_push($valores02,"max-min<10");
}else{
$i=0;
while ($i<10) {
$aleatorio=mt_rand($min,$max);
if (!in_array($aleatorio,$valores02)) {
array_push($valores02,$aleatorio);
$i++;
}
}
}
}
?>
</head>
<body>
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>" >
<div class="item">
MIN :<input name="min" type="text" style="width:100px;" value="1"/>
</div>
<div class="item">
MAX :<input name="max" type="text" style="width:100px; " value="10"/>
</div>
<div class="item">
<input name="maxmin" type="submit" value="Procesar" />
</div>
</form>
<div style="margin-top: 30px; margin-bottom: 30px;">
La primer columna puede tener repetidos la segunda no
</div>
<div style=" margin-left:30px; margin-top:20px;">
<div class="resultado" >
<?php
foreach($valores01 as $val) {
echo( $val . "<br>");
}
?>
</div>
<div class="resultado" style="margin-left:20px;">
<?php
foreach($valores02 as $val) {
echo( $val . "<br>");
}
?>
</div>
</div>
</body>