numeri casuali in php

turillo

Utente Attivo
23 Apr 2012
47
0
0
cari amici volevo avere delle vostre considerazioni in merito alla generazione di numeri casuali in php.
il mio obiettivo è quello di avere un codice che li generi il più possibile "diversi" in N estrazioni.
faccio un esempio per rendere l'idea, considerando l'esempio delle estrazioni di numeri.

1 estrazione: 2 4 8 1
2 estrazione: 2 5 7 3

e cosi via...

il mio problema è questo: come posso costruire un codice che mi vari i numeri generati anche in estrazioni diverse?

evitare di avere cose simili a

1 estrazione: 2 4 8 1
2 estrazione: 4 5 2 3
3 estrazione: 4 1 8 2
4 estrazione: 2 1 5 6

in cui i numeri 2 e 4 sono ripetuti diverse volte alle varie estrazioni

che consigli date per implementare una maggiore casualità/diversità?
 
ciao,
ma le strazioni le memorizzi in un db?
i numeri fino a quanto arrivano?
 
ciao
dimenticavo:
se vuoi evitare di ripetere il numero fai l'estrazione senza ripetizione, cioe fai in modo che un numero estratto non posa più venere estratto.
potresti provare, visto che sono array, a esttrarre verificare se il numero è gia estratto se si estrai di nuovo se no salvi l'estratto.
comunque in questo modo modifichi le propbilita-
ripetendo l'es rand(1,90) es.
1° estrazione probabilita 1/90
2° estrazione probabilità 1/89
3° estrazione probabilità 1/88
...................
89° 1/2
90° 1/1
 
l'estrazione la faccio già senza ripetizione solo che praticamente le estrazioni le faccio a gruppi.

ad esempio,

1 manche
estrazione 1
estrazione 2
etc...

2 manche
estrazione 1
estrazione 2
etc...

ora il problema è che i numeri sono diversi all'interno della stessa manche ma spesso si ripetono nella varie manches

quindi avremo

1 manche
23
44
78
12

2 manche
23
57
78
90

il 23 e il 78 me li ritrovo di nuovo..il mio obiettivo è quello di ridurre questa ridondanza. potrei ad esempio utilizzare un array che memorizzi le estrazioni nelle varie manche, potrebbe essere una soluzione.
 
ciao
non so se ti può seore, ma ho ripescato un mio vecchio script per la distribuzione delle carte a bridge. forse può dartti qualche input
PHP:
<?php
//costruisco il mazzo di carte
$seme[0]=array('2','3','4','5','6','7','8','9','10','F','D','R','A');
$seme[1]=array('2','3','4','5','6','7','8','9','10','F','D','R','A');
$seme[2]=array('2','3','4','5','6','7','8','9','10','F','D','R','A');
$seme[3]=array('2','3','4','5','6','7','8','9','10','F','D','R','A');
$semi=array('picche','cuori','quadri','fiori');
$giocatore=array('sud','ovest','nord','est');
$carte=13;//numero carte per giocatore
for($k=0; $k < 4; $k++){//distribuisco tra i giocatori
	$numero=0;//numero carte distribuite
	while($numero < $carte){//ripeto sino a che non distribuite tutte le carte al giocatore
		$s=rand(0,3);//estraggo il seme
		$c=rand(0,12);//estraggo la carta
		if(isset($seme[$s][$c])){//la carte esiste
			$giocatori[$k][$s].=$seme[$s][$c]." ";//la attribuisco al giocatore
			$numero++;//incremento il umero di carte per il giocatore k
			unset($seme[$s][$c]);//elimino carta dal mazzo
		}
	}
}
//verifica distribuzione
for($k=0;$k<4;$k++){
	echo "giocatore ".$giocatore[$k]."<br>";
	for($j=0;$j<4;$j++){
		echo "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;seme ".$semi[$j].": ".$giocatori[$k][$j]."<br>";
	}
	echo "<hr>";
}
?>
 
ciao
non so se ti può seore, ma ho ripescato un mio vecchio script per la distribuzione delle carte a bridge. forse può dartti qualche input
PHP:
<?php
//costruisco il mazzo di carte
$seme[0]=array('2','3','4','5','6','7','8','9','10','F','D','R','A');
$seme[1]=array('2','3','4','5','6','7','8','9','10','F','D','R','A');
$seme[2]=array('2','3','4','5','6','7','8','9','10','F','D','R','A');
$seme[3]=array('2','3','4','5','6','7','8','9','10','F','D','R','A');
$semi=array('picche','cuori','quadri','fiori');
$giocatore=array('sud','ovest','nord','est');
$carte=13;//numero carte per giocatore
for($k=0; $k < 4; $k++){//distribuisco tra i giocatori
	$numero=0;//numero carte distribuite
	while($numero < $carte){//ripeto sino a che non distribuite tutte le carte al giocatore
		$s=rand(0,3);//estraggo il seme
		$c=rand(0,12);//estraggo la carta
		if(isset($seme[$s][$c])){//la carte esiste
			$giocatori[$k][$s].=$seme[$s][$c]." ";//la attribuisco al giocatore
			$numero++;//incremento il umero di carte per il giocatore k
			unset($seme[$s][$c]);//elimino carta dal mazzo
		}
	}
}
//verifica distribuzione
for($k=0;$k<4;$k++){
	echo "giocatore ".$giocatore[$k]."<br>";
	for($j=0;$j<4;$j++){
		echo "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;seme ".$semi[$j].": ".$giocatori[$k][$j]."<br>";
	}
	echo "<hr>";
}
?>

si infatti è proprio con unset che tu elimini la carta pescata dopo che è stata data al giocatore.
io lo utilizzo anche all'interno della singola manche per avere estrazioni diverse, ma vorrei anche che
le manche contenessero anche tra loro estrazioni diverse: il dubbio però che mi viene è che lo script
non deve implicare che tra le manche ci sia diversità, quindi vediamo se devo considerare o no di
apportare tale modifica.
 
ciao
per essere sicuro che per ogni estrazione e nelle varie manche i numeri non si ripetono potresti fare così,
devi però mettere un controllo che verifichi di non andare (tentare di) ad estrarre elementi dell'array che non esistono, cioè non fare più di un certo numero di estrazioni

PHP:
<?php
$da_estrarre=array();
$min=1;
$max=100;
//creo l'array
for($k=$min; $k <=$max;$k++){
	$da_estrarre[]=$k;
}
//randomizzo (mescolo) l'array
shuffle($da_estrarre);
$n_manche=5;//numero di manche
$n_per_manche=4;//numero di estrazioni per manche
//per fare la verifica
$lunghezza=count($da_estrarre);
for($k=0;$k < $n_manche; $k++){
	$ofset=$n_per_manche*($k);//elemento di partenza per l'estrazione
	//verifico di non estrarre elementi inesistenti (cerco oltre la lunghezza dell'array)
	if(($ofset+$n_per_manche)<$lunghezza){
		//estraggo un sotto array che parte da $ofset e comprende $n_per_manche elementi
		$estrazione[$k]=array_slice($da_estrarre,$ofset,$n_per_manche);
	}else{
		break; //esco dal ciclo
	}
}
//verifica estrazione
echo "<hr>";
foreach($estrazione as $ch_1 => $val_1){
	echo "manche n.: ".($ch_1+1)."<br />";
	foreach ($val_1 as $ch_2 => $val_2){
		echo "&nbsp;&nbsp;&nbsp;".($ch_2+1).") $val_2<br />";
	}
	echo "<hr>";
}
?>
 
ah un altro piccolo dubbio: mi serve generare un numero decimale compreso tra 0 e 1 a due cifre
tipo 0,45 - 0,77 - 0,3 - 0,05 e cosi via..come posso fare?

EDIT: soluzione trovata!
 
Ultima modifica:

Discussioni simili