Newsgroup: it.comp.www.php
Titolo: numeri casuali

<?
srand((double)microtime()*1000000);
for ($i=1; $i<=5; $i++)
{
$nrnd=rand(1,10);
echo $nrnd."<br>";
}
?>
ho usato questo script per generare 5 numeri casuali in un intervallo da 1 a
10, ma vorrei che i numeri dell'intervallo non si ripetano. Come posso fare?
grazie anticipatamente
--
Paolo Badalamenti
--------------------------------------------------------------
50616F6C6F20426164616C616D656E7469

 fare?
devi tenerti una lista che di volta in volta viene privata del valore 
selezionato. il 'dividendo' della probabilità di conseguenza va scalato.
diventa una cosa del genere:
<?
for($i=0;$i<10;$i++) {
        $array[$i]=$i+1;  //popolamento array iniziale
}
print_r($array); //ho aggiunto le stampe per controllare gli indici
srand((double)microtime()*1000000);
$j=10; //dividendo (o range di selezione)
for ($i=1; $i<=5; $i++) {
        $nrnd=rand(1,$j);  //seleziono un valore da 1 a $j
        //che sarà l'indice del valore dell'array da stampare.
        echo "random:".$array[$nrnd-1]."\n";
        //cancello il vecchio elemento:
        array_splice($array,$nrnd-1,1);
        //e diminuisco il range.
        $j--;
        print_r($array); //ogni volta stampo per vedere
        //l'array che diminuisce
}
?>
non sono sicuro che sia la "best-way" ma funzica.
ciao
-- 
Punkarruso
mail:punkarruso chiocchiolona despammed punto com
pubblicità progresso:
http://www.php.net


Puoi mettere in un array i valori casuali e ogni volta che ne hai uno nuovo
fai il controllo su tutto l'array e al posto del for metti un do / while,
con uscita ($conta == 10), dove $conta viene incrementato ogni volta che il
numero random non è ripetuto.
Ciao

quoto quello che dice Andrea Azzini, perché quotare è divertente!!

è statisticamente improbabile, ma in questo modo potrebbe essere necessario 
generare anche un migliaio di numeri prima di uscire dal ciclo!!
ciao
-- 
Punkarruso
mail:punkarruso chiocchiolona despammed punto com
pubblicità progresso:
http://www.nist.gov/dads/

 10, ma vorrei che i numeri dell'intervallo non si ripetano. Come posso
fare?
Leggendo manuali php si fa breve:
<?php
 shuffle($n=range(1,10));
 echo join("<BR>",$n)."<BR>";
?>
;-P

 non sono sicuro che sia la "best-way" ma funzica.
rettifico: funzica, ma sicuramente non è la best-way.
:-(
(vedere soluzione di Jurgen)
-- 
Punkarruso
mail:punkarruso chiocchiolona despammed punto com
pubblicità progresso:
http://www.netmeister.org/news/learn2quote.html

 rettifico: funzica, ma sicuramente non è la best-way.
Dipende, l'implementazione di shuffle in PHP non e' la
migliore, e penso che con un spectral test modificato
non avra' tanto da ridere. Meglio il Fisher-Yates shuffle.
Ma qualcuno conosce il Knuth, Art of computer programming,
o mi deludo? Sezione 3.4.2 di Volume 2 contiene il tutto
su sequenze random. Se no, comprare e meditare.
--
Anyone who considers arithmetical methods of producing
random digits is, of course, in a state of sin.
- J. von Neumann 1951

 rettifico: funzica, ma sicuramente non è la best-way.
Ancora un chicca (per (linu|uni)x-isti):
 # perldoc -q shuffle

 su sequenze random. Se no, comprare e meditare.
3.4.2 random sampling and shuffling??
azzarola...
The Art of Computer Programming, Volumes 1-3 Boxed
        by Donald Ervin Knuth, Donald E. Knuth; Hardcover 
        $149.99
visto il prezzo, sarebbe proprio bello trovarlo in biblioteca e farsi prima 
un giro di degustazione gratuita!
vale la spesa???
anche considerando che l'open source ti mette a disposizione tutti gli 
algoritmi senza doverli per forza imparare tutti?
oppure è un'introduzione concettuale e lascia l'algoritmo e la 
programmazione come pussa-caffè??
se penso che con quella cifra mi pago 10 giornalieri per questo inverno mi 
vien male!
:-)
-- 
Punkarruso
mail:punkarruso chiocchiolona despammed punto com
pubblicità progresso:
http://www.efluxa.it/netiquette/

 programmazione come pussa-caffè??
Molta, molta, molta matematica, molti esercizi per niente banali. Diciamo un
vero guru alle prese per rompere il cervello altrui.
Il prezzo e' problematico, questo si, ma quello che trovi ti fa un bel po'
di cultura. A volte trovi esempi in rete (PDF).

 di cultura. A volte trovi esempi in rete (PDF).
cercherò ;-)
grazie!
-- 
Punkarruso
mail:punkarruso chiocchiolona despammed punto com
pubblicità progresso:
http://www.gnu.org/gnu/manifesto.it.html