Newsgroup: it.comp.www.php
Titolo: Ciclo di controllo

Salve a tutti...
ho una richiesta da fare...
come faccio a far un controllo ciclico del tipo:
1 assegno un valore ad una variabile a caso tra uno e tre
2 ne assegno un altro alla seconda variabile,sempre random, ma diversa dalla
prima?
Per ora faccio una cosa orripilante e incorretta del tipo:
$a= rand(1,3);
$b= rand(1,3);
if ($a==$b){
$b= rand(1,3);
else {
$b==$b;
}
}
con il ciclo if rifatto varie volte uguale... diciamo 100 volte.
In questo modo ci sono 1/(3exp100) di non sbagliare... abbastanza sicuro..
ma non certo e caotico.
Chi sa come aiutarmi?
Grazie e scusate della mia inesperienza

 ha scritto nel messaggio
news:64dE9.50450$744.1...@news1.tin.it...


 ha scritto nel messaggio
news:hjrE9.20698$2B1.5...@twister2.libero.it...


 ha scritto nel messaggio
news:zRrE9.20823$2B1.5...@twister2.libero.it...


 Mica conosci una possibilità di ciclare il ciclo if?
In che senso?


prima?
Nel caso da 0 a N (che, per N=2, e' il tuo caso, basta sommare 1) e'
facile:
	$a = rand(0, N);
Perche' B sia random immagina di togliere A dall'intervallo 0..N; ti
resta un intervallo 0..N-1; qui scegli a caso, ma con la convenzione
che i numeri da 0 a N-1-a li "mapperai" da a+1 ad a+1+N-1-a = N, gli
altri fra 0 e a-1 (e N-1-a+a-1+1 fa appunto N-1).
Questa mappatura non e' altro che una operazione di modulo:
	$b = ($a + rand(0, N-1) + 1) % N;
Leonardo piu' o meno

Scusa, mi sono espresso male,
una situazione del genere, da risultati sufficientemente *casuali*?
//scelta numeri
$num1=rand (1,3);
$num2=rand (1,3);
$num3=rand (1,3);
//controllo numeri
while ($num1==$num2) {
$num2=rand (1,3);
}
while ($num3==$num1 or $num3==$num2) {
$num3=rand (1,3);
}
Ps grazie dell'interessamento
--
Massy
Tutto sul mondo della patente
<< 
www.autoscuolacarnevale.it
 >>


 
in effetti questo sarebbe sufficente, ma il problema e come qualcuno
ha detto sulla generazione di numeri casuali, infatti sia array_rand
che shuffle si basano sulla funzione rand che anche se inizializzata
ad ogni ciclo tende a dare numeri pseudocasuali che si ripetono
spesso.
function shake_array($a,$f){
if(!is_array($a)){
echo "errore nel type";
}
else{
$b = count($a);
$T = $f*$b;
for($g=0;$g<$T;$g++){
$c = mt_rand (0,$b-1);
$d = mt_rand (0,$b-1);
$e = $a[$c];
$a[$c] = $a[$d];
$a[$d] = $e;
}
}
return $a;
}
Io ho creato questa funzioncina un po' cervellotica ma che da buoni
risultati quindi modificherei il tuo script così:
$array=array(1,2,3);
$rand=shake_array($array,2);
$a=$rand[0];
$b=$rand[1];
print "$a $b";
il sistema più sicuro cmq per generare numeri casuali è affidarsi ad
una fonte esterna come il campionamento dei suoni d'ambiente e
similari

 }

Leonardo piu' o meno
E infatti ho sbagliato, mi sono confuso fra N e N-1.
Questa e' la formula corretta:
	$a = rand(0, N-1);
	$b = ($a + rand(0, N-2) +1 ) % N;
oppure, usando direttamente N-1:
	$a = rand(0, N);
	$b = ($a + rand(0, N-1) +1 ) % (N+1);
Per penitenza scrivo il codice e faccio la prova :-)
<?
	// Math by 
ser...@tin.it
	// Error messages inspired by Max "Sballo" [1]
        $N = 3;
        $n = 10000;
        $K = $n/($N*($N-1));
        $bayes = array();
        for ($y = 1; $y <= $N; $y++)
        {
                $bayes[$y] = array();
                for ($x = 1; $x <= $N; $x++)
                        $bayes[$y][$x] = 0;
        }
        for ($try=0; $try < $n; $try++)
        {
                $a = rand(0, $N-1);
                $b = ($a + rand(0, $N-2) +1 ) % $N;
                $bayes[$a+1][$b+1]++;
        }
        $check = 0;
        for ($y = 1; $y <= $N; $y++)
        {
                $v = $bayes[$y];
                for ($x=1; $x <=$N; $x++)
                {
                        if ($x == $y)
                        {
                                if ($v[$x] != 0)
                                {
                                        print "($x,$y)=$v[$x]: posa i'
fiasco!\n
";
                                        exit();
                                }
                                print "- ";
                                continue;
                        }
                        $check += $v[$x];
                        $d = $v[$x]/$K;
                        if ($d < 0.9 || $d > 1.1)
                        {
                                print "($x,$y) = $v[$x]|$K: falla
girare.\n";
                                exit();
                        }
                        print "$v[$x] ";
                }
                print "\n";
	}
        if ($check != $n)
        {
                print "$check!=$n: slega il laccio e mandala in
circolo.\n";
                exit();
        }
        print "\nTutto bene per N=$N con $n tentativi\n";
?>
- 1658 1607
1666 - 1669
1710 1690 -
Tutto bene per N=3 con 10000 tentativi
- 513 540 507 473
492 - 502 495 478
486 521 - 492 507
510 498 512 - 470
517 521 461 505 -
Tutto bene per N=5 con 10000 tentativi
(Come si vede, la funzione rand() non e' proprio bianca: per $N grande
rispetto alla radice quadrata di $n il sistema domandera', impaziente,
di far girare quella canna).
Leonardo che se gli gira lo reimplementa con le funzioni Zeta <g>
[1] non frequenta il gruppo e non ha niente a che fare con i computer,
    pero' quando non e' strafatto perso [2] vi giuro che e' simpatico.
[2] pare che sia stato visto sobrio nel 1993 in trattoria, ma molti la
    ritengono una leggenda urbana
-- 
Time's angles, mages tell, conceal a place
incredible, beyond the mundane mind;
night-shrouded and between the seas of space
dread creatures drift in the ageless winds.