WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   Slumpa olika tal mellan 1 och 29 (https://www.wn.se/forum/showthread.php?t=8728)

Filip 2005-07-01 14:34

Jag ska få fram fem olika tal mellan 1 och 29. Dvs ett tal får inte förekomma två gånger.
Använder nu följande metod. Men den känns lite krånglig. Finns det någon bättre variant?

$first = rand(1,29);
do {
$second = rand(1,29);
} while($first==$second);

do {
$third = rand(1,29);
} while($third==$first || $third==$second);

do {
$fourth = rand(1,29);
} while($fourth==$first || $fourth==$second || $fourth==$third);

do {
$fifth = rand(1,29);
} while($fifth==$first || $fifth==$second || $fifth==$third || $fifth==$fourth);

Björn 2005-07-01 15:25

1 - skapa en array med de olika värdena i
kör rand() på arrayen

Filip 2005-07-01 15:35

Citat:

Originally posted by Björn@Jul 1 2005, 15:25
1 - skapa en array med de olika värdena i
kör rand() på arrayen

Perfekt!
Det var exakt något sådant jag letade efter!
Tack så mycket!

Filip 2005-07-01 15:40

Tänkte jag kunde bidra med min färdiga kod:

$input = array("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29");
$rand_keys = array_rand($input, 5);

print $input[$rand_keys[0]];
print $input[$rand_keys[1]];
print $input[$rand_keys[2]];
print $input[$rand_keys[3]];
print $input[$rand_keys[4]];

tino 2005-07-01 15:48

<pre>
<?php

$array = array();

for ($i=0; $i < 5; $i++)
{
do {
$num = mt_rand(1,29);
} while (in_array($num, $array));

$array[] = $num;
}

print_r($array);

?>
</pre>

Filip 2005-07-01 16:27

Citat:

Originally posted by tino@Jul 1 2005, 15:48
pre
?php
array = array();
for (i=0; i 5; i++)
{
do {
num = mt_rand(1,29);
} while (in_array(num, array));
array[] = num;
}
print_r(array);
?
/pre

Ännu bättre!
Den varianten tar en tredjedel kortare tid!
Variant 1 tid: 0.00029587745666504
Variant 2 tid: 0.00020003318786621
Någon som har ännu bättre idé?
(vi kanske ska starta en tävling här?)

Standout 2005-07-01 16:37

Tidsskillnaden beror nog främst på att du kör print fem gånger i den första varianten, och bara ett enda print_r i den andra.

grazzy 2005-07-01 16:40

Mitt bidrag:
Kod:

$map=array();
while(array_sum($map)<5) {
$map{mt_rand(0,29)}=1;
}
print_r($map);

Ett exempel som påminner lite om tinos som jag noterade på sidan om mt_rand:
Kod:

$randomNumbers = array(); // storage array
for ($i=0;$i<20;$i++) {
  $random = mt_rand(0,30);
  while(in_array($random,$randomNumbers)) {
    $random = mt_rand(0,30);  }
  array_push($randomNumbers,$random);
  echo $random;
}

Edit: tänk på att php inte har några "arrayer" utan att de alltid är hashes egentligen, då kan man ju lika gärna utnyttja de funktioner som en hash faktiskt erbjuder ;)

Crotalus 2005-07-01 20:54

Mitt förslag:

Kod:

$array = range(1,29);
shuffle($array);
$array = array_slice($array, 0, 5);
print_r($array);


Filip 2005-07-01 21:12

Citat:

Originally posted by Standout@Jul 1 2005, 16:37
Tidsskillnaden beror nog främst på att du kör print fem gånger i den första varianten, och bara ett enda print_r i den andra.

När jag mätte, så använde jag print_r på båda.


Alla tider är GMT +2. Klockan är nu 01:25.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson