Kom ihåg mig?
Home Menu

Menu


Slumpa olika tal mellan 1 och 29

 
Ämnesverktyg Visningsalternativ
Gammal 2005-07-01, 14:34 #1
Filips avatar
Filip Filip är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jan 2003
Inlägg: 935
Filip Filip är inte uppkopplad
Mycket flitig postare
Filips avatar
 
Reg.datum: Jan 2003
Inlägg: 935
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);
Filip är inte uppkopplad   Svara med citatSvara med citat
Gammal 2005-07-01, 15:25 #2
Björn Björn är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: May 2004
Inlägg: 1 224
Björn Björn är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: May 2004
Inlägg: 1 224
1 - skapa en array med de olika värdena i
kör rand() på arrayen
Björn är inte uppkopplad   Svara med citatSvara med citat
Gammal 2005-07-01, 15:35 #3
Filips avatar
Filip Filip är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jan 2003
Inlägg: 935
Filip Filip är inte uppkopplad
Mycket flitig postare
Filips avatar
 
Reg.datum: Jan 2003
Inlägg: 935
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 är inte uppkopplad   Svara med citatSvara med citat
Gammal 2005-07-01, 15:40 #4
Filips avatar
Filip Filip är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jan 2003
Inlägg: 935
Filip Filip är inte uppkopplad
Mycket flitig postare
Filips avatar
 
Reg.datum: Jan 2003
Inlägg: 935
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]];
Filip är inte uppkopplad   Svara med citatSvara med citat
Gammal 2005-07-01, 15:48 #5
tino tino är inte uppkopplad
Medlem
 
Reg.datum: May 2004
Inlägg: 73
tino tino är inte uppkopplad
Medlem
 
Reg.datum: May 2004
Inlägg: 73
<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>
tino är inte uppkopplad   Svara med citatSvara med citat
Gammal 2005-07-01, 16:27 #6
Filips avatar
Filip Filip är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jan 2003
Inlägg: 935
Filip Filip är inte uppkopplad
Mycket flitig postare
Filips avatar
 
Reg.datum: Jan 2003
Inlägg: 935
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?)
Filip är inte uppkopplad   Svara med citatSvara med citat
Gammal 2005-07-01, 16:37 #7
Standouts avatar
Standout Standout är inte uppkopplad
Flitig postare
 
Reg.datum: Feb 2004
Inlägg: 356
Standout Standout är inte uppkopplad
Flitig postare
Standouts avatar
 
Reg.datum: Feb 2004
Inlägg: 356
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.
Standout är inte uppkopplad   Svara med citatSvara med citat
Gammal 2005-07-01, 16:40 #8
grazzy grazzy är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Mar 2004
Inlägg: 3 471
grazzy grazzy är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Mar 2004
Inlägg: 3 471
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
grazzy är inte uppkopplad   Svara med citatSvara med citat
Gammal 2005-07-01, 20:54 #9
Crotalus Crotalus är inte uppkopplad
Nykomling
 
Reg.datum: Dec 2004
Inlägg: 40
Crotalus Crotalus är inte uppkopplad
Nykomling
 
Reg.datum: Dec 2004
Inlägg: 40
Mitt förslag:

Kod:
$array = range(1,29);
shuffle($array);
$array = array_slice($array, 0, 5);
print_r($array);
Crotalus är inte uppkopplad   Svara med citatSvara med citat
Gammal 2005-07-01, 21:12 #10
Filips avatar
Filip Filip är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jan 2003
Inlägg: 935
Filip Filip är inte uppkopplad
Mycket flitig postare
Filips avatar
 
Reg.datum: Jan 2003
Inlägg: 935
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.
Filip är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
 

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


Alla tider är GMT +2. Klockan är nu 21:06.

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