[php] echt random

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 02-09 11:02
PHP:
1
2
3
4
5
6
7
<?
for($i=1;$i<=5;$i++)
{
    $bomnr=rand(1,9);
//en dan wat acties
}
?>

maar hoe voor kom ik nou dat ik dit krijg
2,5,2,5,3
oftwel meerdere gelijke getallen omdat het een klein bereik is voor de random functie
heb het al geprobeerd met query's en met een array geprobeerd maar krijg het niet voor elkaar
wie ziet de fout(en)?

Doet iets met Cloud (MS/IBM)


Acties:
  • 0 Henk 'm!

  • CyberSnooP
  • Registratie: Augustus 2000
  • Laatst online: 16-08 06:44

CyberSnooP

^^^^ schrijft --->

Dit wat hieronder staat heeft niks te maken met jou vraag.. ik vind het alleen zonde om weg te halen:
De srand() functie moet je eerst gebruiken om de randomizer engine te voeden.

Maar het schijnt beter te zijn om de mt_srand functie in combinatie met de mt_rand functie te gebruiken.

En dan nog even een keurig voorbeeldje erbij:
PHP:
1
2
3
4
5
<?
// seed with microseconds since last "whole" second
mt_srand ((double) microtime() * 1000000);
$randval = mt_rand();
?>

|_____vakje______|


Acties:
  • 0 Henk 'm!

  • Grum
  • Registratie: Juni 2001
  • Niet online
random betekend niet automatisch altijd anders

als jij random een getal pakt uit de lijst 1,2 reken maar dat jij dubbele krijgt :) .. hoe vaker je het doet en hoe kleiner je lijst is hoe meer dubbele je krijgt ...

Acties:
  • 0 Henk 'm!

  • Tim
  • Registratie: Mei 2000
  • Laatst online: 04-08 16:29

Tim

Op vrijdag 22 juni 2001 20:47 schreef D2k het volgende:
PHP:
1
2
3
4
5
6
7
<?
for($i=1;$i<=5;$i++)
{
    $bomnr=rand(1,9);
//en dan wat acties
}
?>

maar hoe voor kom ik nou dat ik dit krijg
2,5,2,5,3
oftwel meerdere gelijke getallen omdat het een klein bereik is voor de random functie
heb het al geprobeerd met query's en met een array geprobeerd maar krijg het niet voor elkaar
wie ziet de fout(en)?
er zit geen fout in, maar het is random.. dus met 10 cijfers heb je 1 op 10 kans op een getal, als je dat 5 keer doet, heb je grote kans dat je 2 keer het zelfde getal krijgt ja..
[edit] Grum, kap noau! ;) [edit]

Acties:
  • 0 Henk 'm!

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 02-09 11:02
Op vrijdag 22 juni 2001 20:49 schreven Grum_ en timpie:
reken maar dat jij dubbele krijgt :)
en dat wilde ik nou juist voorkomen :)

Doet iets met Cloud (MS/IBM)


Acties:
  • 0 Henk 'm!

  • CyberSnooP
  • Registratie: Augustus 2000
  • Laatst online: 16-08 06:44

CyberSnooP

^^^^ schrijft --->

En dan nu een beter antwoord
PHP:
1
2
3
4
5
6
7
8
9
<?
$getalletjes = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

for ($i = 1; $i <= 5; $i++) {
 mt_srand ((double) microtime() * 1000000);
 $randval = mt_rand(0, count($getalletjes) - 1);
 $uitkomst[] = $getalletjes[$randval];
}
?>

$uitkomst[1] t/m $uitkomst[5] bevatten 5 unieke getallen.

Ik heb het niet getest, fouten voorbehouden dus :)

|_____vakje______|


Acties:
  • 0 Henk 'm!

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 02-09 11:02
Op vrijdag 22 juni 2001 20:54 schreef CyberSnooP het volgende:
En dan nu een beter antwoord
PHP:
1
2
3
4
5
6
7
8
9
<?
$getalletjes = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

for ($i = 1; $i <= 5; $i++) {
 mt_srand ((double) microtime() * 1000000);
 $randval = mt_rand(0, count($getalletjes) - 1);
 $uitkomst[] = $getalletjes[$randval];
}
?>

$uitkomst[1] t/m $uitkomst[5] bevatten 5 unieke getallen.

Ik heb het niet getest, fouten voorbehouden dus :)
doet het perfect
damn dat ik dat niet zelf kon bedenken |:(

Doet iets met Cloud (MS/IBM)


Acties:
  • 0 Henk 'm!

  • Tim
  • Registratie: Mei 2000
  • Laatst online: 04-08 16:29

Tim

Op vrijdag 22 juni 2001 20:54 schreef CyberSnooP het volgende:
En dan nu een beter antwoord
PHP:
1
2
3
4
5
6
7
8
9
<?
$getalletjes = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

for ($i = 1; $i <= 5; $i++) {
 mt_srand ((double) microtime() * 1000000);
 $randval = mt_rand(0, count($getalletjes) - 1);
 $uitkomst[] = $getalletjes[$randval];
}
?>

$uitkomst[1] t/m $uitkomst[5] bevatten 5 unieke getallen.

Ik heb het niet getest, fouten voorbehouden dus :)
eerste wat ik terugkrijg is:
0 : 8
1 : 8
2 : 8
3 : 8
4 : 8
;)

Acties:
  • 0 Henk 'm!

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 02-09 11:02
Op vrijdag 22 juni 2001 21:00 schreef Timpie2000 het volgende:

[..]

eerste wat ik terugkrijg is:
0 : 8
1 : 8
2 : 8
3 : 8
4 : 8
;)
ik krijg ook nog steeds dubbele :(

Doet iets met Cloud (MS/IBM)


Acties:
  • 0 Henk 'm!

  • CyberSnooP
  • Registratie: Augustus 2000
  • Laatst online: 16-08 06:44

CyberSnooP

^^^^ schrijft --->

Nog steeds ongetest, maar i.i.g. super stomme bug gefixt:
PHP:
1
2
3
4
5
6
7
8
9
10
11
<?
$getalletjes = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

mt_srand ((double) microtime() * 1000000);

for ($i = 1; $i <= 5; $i++) {
 $randval = mt_rand(0, count($getalletjes) - 1);
 $uitkomst[] = $getalletjes[$randval];
 unset($getalletjes[$randval]);
}
?>

$uitkomst[1] t/m $uitkomst[5] bevatten 5 unieke getallen.

WERKT NOG NIET

|_____vakje______|


Acties:
  • 0 Henk 'm!

  • Tim
  • Registratie: Mei 2000
  • Laatst online: 04-08 16:29

Tim

hij werkt al beter, maar het is beter om gewoon te controleren of het getal al is voorgekomen..

Acties:
  • 0 Henk 'm!

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 02-09 11:02
Op vrijdag 22 juni 2001 21:06 schreef CyberSnooP het volgende:
Nog steeds ongetest, maar i.i.g. super stomme bug gefixt:
PHP:
1
2
3
4
5
6
7
8
9
10
11
<?
$getalletjes = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

mt_srand ((double) microtime() * 1000000);

for ($i = 1; $i <= 5; $i++) {
 $randval = mt_rand(0, count($getalletjes) - 1);
 $uitkomst[] = $getalletjes[$randval];
 unset($getalletjes[$randval]);
}
?>

$uitkomst[1] t/m $uitkomst[5] bevatten 5 unieke getallen.
beter maar er zitten soms lege plekken in?

Array ( [0] => 2 [1] => 5 [2] => [3] => 4 [4] => 6 )

Doet iets met Cloud (MS/IBM)


Acties:
  • 0 Henk 'm!

  • Grum
  • Registratie: Juni 2001
  • Niet online
Op vrijdag 22 juni 2001 20:57 schreef D2k het volgende:

[..]

doet het perfect
damn dat ik dat niet zelf kon bedenken |:(
ik ga toch zeggen dattet niet werkt :)

Acties:
  • 0 Henk 'm!

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 02-09 11:02
Op vrijdag 22 juni 2001 21:12 schreef Grum_ het volgende:

[..]

ik ga toch zeggen dattet niet werkt :)
heb ik ook gezegd
de eerste 2x was goed :)
daarna niet meer

Doet iets met Cloud (MS/IBM)


Acties:
  • 0 Henk 'm!

  • CyberSnooP
  • Registratie: Augustus 2000
  • Laatst online: 16-08 06:44

CyberSnooP

^^^^ schrijft --->

Ik voel me ongeloofelijk stom, maar ik zoek nog ff iets om het te fixen.

|_____vakje______|


Acties:
  • 0 Henk 'm!

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 02-09 11:02
Op vrijdag 22 juni 2001 21:14 schreef CyberSnooP het volgende:
Ik voel me ongeloofelijk stom, maar ik zoek nog ff iets om het te fixen.
niet doen, jezelf stom vinden
ik kon het ook niet :Y)

Doet iets met Cloud (MS/IBM)


Acties:
  • 0 Henk 'm!

  • Grum
  • Registratie: Juni 2001
  • Niet online
zal ik dan maar de oplossing geven ? :)
PHP:
1
2
3
4
5
6
7
8
<?
$array = array(1,2,3,4,5,6,7,8,9,10);
for($i=0;$i<5;$i++)
{
   $val = (array_splice($array,intval(rand(0,count($array)-1)),1));
   print "$val[0] ";
}
?>

dit zou moeten werken .. ik ga et ff testen laat het zo wel weten :)

Acties:
  • 0 Henk 'm!

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 02-09 11:02
Op vrijdag 22 juni 2001 21:15 schreef Grum_ het volgende:
zal ik dan maar de oplossing geven ? :)
PHP:
1
2
3
4
5
6
<?
$lijst = array(1,2,3,4,5,6,7,8,9,10);
for($i=0;$i<5;$i++)
   print array_splice($lijst,intval(rand(0,count($array)-1),1);
}
?>

dit zou moeten werken .. ik ga et ff testen laat het zo wel weten :)
mist al een {

Doet iets met Cloud (MS/IBM)


Acties:
  • 0 Henk 'm!

  • CyberSnooP
  • Registratie: Augustus 2000
  • Laatst online: 16-08 06:44

CyberSnooP

^^^^ schrijft --->

Zo... Dit werkt i.i.g. ook :)
PHP:
1
2
3
4
5
<?
$uitkomst = range(1,10);
shuffle($uitkomst);
$uitkomst = array_slice($uitkomst, 0, 5);
?>

Veel plezier ermee.

|_____vakje______|


Acties:
  • 0 Henk 'm!

  • Grum
  • Registratie: Juni 2001
  • Niet online
hij klopt nu :p .. zoals ik zei teste ik em eerst nog ff .. maar me kcma doet een beetje brakjes :) (der was nog wel meer mis mee :p
nog een missend )'tje etc etc etc

Acties:
  • 0 Henk 'm!

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 02-09 11:02
Op vrijdag 22 juni 2001 21:15 schreef Grum_ het volgende:
zal ik dan maar de oplossing geven ? :)
PHP:
1
2
3
4
5
6
7
8
<?
$array = array(1,2,3,4,5,6,7,8,9,10);
for($i=0;$i<5;$i++)
{
   $val = (array_splice($array,intval(rand(0,count($array)-1)),1));
   print "$val[0] ";
}
?>

dit zou moeten werken .. ik ga et ff testen laat het zo wel weten :)
deze doet het volgens mij

Doet iets met Cloud (MS/IBM)


Acties:
  • 0 Henk 'm!

  • Grum
  • Registratie: Juni 2001
  • Niet online
Op vrijdag 22 juni 2001 21:18 schreef CyberSnooP het volgende:
PHP:
1
2
3
4
5
<?
$uitkomst = range(1,10);
shuffle($uitkomst);
$uitkomst = array_slice($uitkomst, 0, 5);
?>
komt eigelijk op hezelfde neer jah ... alleen het is nog maar de vraag hoe 'random' shuffle is :)

Acties:
  • 0 Henk 'm!

  • CyberSnooP
  • Registratie: Augustus 2000
  • Laatst online: 16-08 06:44

CyberSnooP

^^^^ schrijft --->

Op vrijdag 22 juni 2001 21:21 schreef Grum_ het volgende:
alleen het is nog maar de vraag hoe 'random' shuffle is :)
Volgens de ChangeLog is die nog al eens aangepast (dacht ik) dus het zal wel werken.

|_____vakje______|


Acties:
  • 0 Henk 'm!

  • Markuzi
  • Registratie: November 2000
  • Laatst online: 25-02 07:26
Op vrijdag 22 juni 2001 21:21 schreef Grum_ het volgende:

[..]

komt eigelijk op hezelfde neer jah ... alleen het is nog maar de vraag hoe 'random' shuffle is :)
Shuffle() is net zo random als rand() maar wel eerst voor het zaadgetalletje zorgen natuurlijk.
PHP:
1
2
3
<?
mt_srand ((double) microtime() * 1000000);
?>

Acties:
  • 0 Henk 'm!

Verwijderd

Hint: vervang de array getalletjes met een nieuwe waar de al bepaalde waarde niet meer in voorkomt.

<?$getalletjes = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
for ($i = 1; $i <= 5; $i++) {
mt_srand ((double) microtime() * 1000000);
$randval = mt_rand(0, count($getalletjes) - 1);
$uitkomst[] = $getalletjes[$randval];

******
hiet moet de array getalletjes opnieuw gevuld worden met alle waarden van de vorige behalve het item getalletjes[$randval].
******
}
?>

Acties:
  • 0 Henk 'm!

  • Grum
  • Registratie: Juni 2001
  • Niet online
Op vrijdag 22 juni 2001 21:53 schreef IkkePikke het volgende:
[...]
fijn dat je de thread leest ...

|:( |:( |:( |:( |:(

Acties:
  • 0 Henk 'm!

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 02-09 11:02
Op vrijdag 22 juni 2001 22:01 schreef Grum_ het volgende:

[..]

fijn dat je de thread leest ...

|:( |:( |:( |:( |:(
ik wou er eerst nix van zeggen
maar ben het met je eens :)

Doet iets met Cloud (MS/IBM)


Acties:
  • 0 Henk 'm!

  • CyberSnooP
  • Registratie: Augustus 2000
  • Laatst online: 16-08 06:44

CyberSnooP

^^^^ schrijft --->

Ik heb eigenlijk nog een vraag.. Kan ik geen element wissen uit $getalletjes? Dus dat de keys 6->5 en 7->6 en 8->7 etc.. gaan als ik de 5 verwijder?? Dan zou mijn eerste dingetje tenminste echt werken.

|_____vakje______|


Acties:
  • 0 Henk 'm!

  • Nielsz
  • Registratie: Maart 2001
  • Niet online
Op zaterdag 23 juni 2001 10:38 schreef CyberSnooP het volgende:
Ik heb eigenlijk nog een vraag.. Kan ik geen element wissen uit $getalletjes? Dus dat de keys 6->5 en 7->6 en 8->7 etc.. gaan als ik de 5 verwijder?? Dan zou mijn eerste dingetje tenminste echt werken.
Ik dacht niet dat daar een functie voor was. Dan zou je daar een funcie voor moeten schrijven. Maar het kan natuurlijk wel +

Acties:
  • 0 Henk 'm!

  • vargo
  • Registratie: Januari 2001
  • Laatst online: 09:35
Op zaterdag 23 juni 2001 10:38 schreef CyberSnooP het volgende:
Ik heb eigenlijk nog een vraag.. Kan ik geen element wissen uit $getalletjes? Dus dat de keys 6->5 en 7->6 en 8->7 etc.. gaan als ik de 5 verwijder?? Dan zou mijn eerste dingetje tenminste echt werken.
Ander ideetje: werk ipv met een array met objecten en pointers...
Creëer voor elk random getal een object en zo'n object bevat dan:
1) de (random) waarde
2) een pointer naar het volgende object

Zodra je dan er 1 uit wil wissen pak je het object ervoor en dat verwijs je naar het object erna.

Ik weet niet of dit ook onder Php voor elkaar te krijgen valt, maar onder java lukte dit wel...

Acties:
  • 0 Henk 'm!

  • CyberSnooP
  • Registratie: Augustus 2000
  • Laatst online: 16-08 06:44

CyberSnooP

^^^^ schrijft --->

Dat lijkt me een typische JAVA oplossing :-) Ik heb weinig ervaring met Java, maar toch. In PHP is het een wat minder success dat OO+Pointers en het lijkt me een beetje overkill m.b.t. dit topic.

Maar ik snap je methode nog niet 100%, want hoe raadpleeg ik dan object nummer $x? Moet ik dan begin bij het eerste object en dan $x-maal naar het volgende object gaan (d.m.v. de pointer)

|_____vakje______|

Pagina: 1