Något sånt här?
<?php
srand ( ( double ) microtime () + 1000000 );
for ( $i = 0; $i < 5; $i++ )
$unika[$i] = rand ( 1, 100 );
?>
13 svar · 259 visningar · startad av greymane
jag ska slumpa 5 tal mellan 1 o 100. det måste vara 5 unika tal. hur gör jag det? jag använder mt_rand()
Något sånt här?
<?php
srand ( ( double ) microtime () + 1000000 );
for ( $i = 0; $i < 5; $i++ )
$unika[$i] = rand ( 1, 100 );
?>
är det garanterat att jag inte får några dubbletter då?
Ja, det ska det vara. Det går inte att få mer random. Du ska alltid ta microtime()+1000000 för att det ska bli så mycket random som möjligt. Inte mer och inte mindre, en miljon är standard.
Kan man inte göra en funktion som kollar om man redan har slumpat fram en siffra och i så fall slumpa fram en ny, då skulle man kunna känna sig säker jö
/Marty
Det känns som att det är för mycket jobb, det är ju trots allt endast fem nummer som ska slumpas fram.
Med raderna kod som jag visade kommer dessa nummer garanterat (?) vara olika.
SPiN> om man reloadar ska det ju komma nya siffror... varför inte? det måste det ju göra.
[Redigerat av greymane den 09 jan 2002]
Gör det inte det? Jag vet faktiskt inte varför... De kanske kopplas till den aktuella sessionen, men det låter ju konstigt.
SPiN> Om jag ändrar intervallet inom vilket talen plockas från, kommer nya tal fram. ändrar jag tillbaka till det gamla intervallet, kommer de gamla siffrorna fram igen skumt!
nån kan väl? jag behöver hjälp!
Prova med gånger istället för plus:
srand ( ( double ) microtime () * 1000000 );
En annan sak är att slumptalen inte kommer att bli unika.
Jämför:
srand ( ( double ) microtime () * 1000000 );
for ( $i = 0; $i < 100; $i++ ){
$unika[$i] = rand ( 1, 100 );
}
$tal=array_count_values ($unika);
ksort($tal);
while (list ($key, $val) = each ($tal)) {
echo "$key => $val<br>\n"; }
med:
srand ( ( double ) microtime () * 1000000 );
$unika[] = rand ( 1, 100 );
while (sizeof($unika)<100){
$testrand = rand ( 1, 100 );
if (!in_array($testrand,$unika)){
$unika[] = $testrand;}
}
$tal=array_count_values ($unika);
ksort($tal);
while (list ($key, $val) = each ($tal)) {
echo "$key => $val<br>\n"; }
matte> Jag va inte riktigt med på den sista kodsnutten... när jag körde den skrev den ut
1 => 1
2 => 1
3 => 1
osv...
tyvärr kan jag inte rätta till det själv då koden överstiger mina kunskaper. vad e fel?
$tal=array_count_values ($unika); //Räknar ut hur många identiska värde det finns i arrayen och lägger dom i en ny array där nyckeln är värdet i den ursprungliga arrayen och värdet är antalet träffar.
ksort($tal); // sorterar arrayen.
while (list ($key, $val) = each ($tal)) {
echo "$key => $val<br>\n"; } // skriver ut en lista på Nyckel och Värde med texten ' => ' emellan.
Står det till exempel 4 => 2, så betyder det att värdet 4 finns två gånger i arrayen.
Vad jag menade var att för att få en array med unika värden får du använda något liknande det här:
srand ( ( double ) microtime () * 1000000 );
$unika[] = rand ( 1, 100 );
while (sizeof($unika)<5){
$testrand = rand ( 1, 100 );
if (!in_array($testrand,$unika)){
$unika[] = $testrand;}
}
kanon! nu fick jag rätt på det! tackar