Autor Zpráva
Micruss
Profil
zdravím, chtěl bych se zeptat jak udělat
Náhodné generování více čísel, aniž by se opakovali
for($i=1; $i<=5; $i++) {
$nahodne = rand(1, 20);

}
Jedině s čím potřebuji pomoct, je že chci z 20 čísel vybrat náhodně 5 čísel ale nechci aby se opakovali, zkoušel jsem toto project googlem apodobně, ale nikde jsem nic nenašel :-/ nějaký návrhy?
Jan Tvrdík
Profil
Micruss:
<?php
$nahodnaCisla = array();
do {
    $cislo = rand(1, 20);
    if (!in_array($cislo, $nahodnaCisla)) $nahodnaCisla[] = $cislo;
} while (count($nahodnaCisla) < 5);
Micruss
Profil
Jan Tvrdík:
Mno musím říct, že mě todle ale vůbec nenapadlo, furt jsem přemýšlel nad nějakou matikou :D,

Super díky :-)
Joker
Profil
Viz třeba Neopakujicí se čisla..

<?php
$cisla = range(1, 10); // pole čísel od 1 do 10
shuffle($cisla); // promícháme pole
// …a vezmeme první tři prvky:
echo $cisla[0].", ".$cisla[1].", ".$cisla[2];

Čím větší bude podíl počtu vybraných čísel k počtu všech čísel ze kterých se vybírá, tím lepší bude použít tento postup.
Naopak čím bude menší, tím výhodnější bude postup podle [#2] Jan Tvrdík.
(Neboli pro výběr dvou čísel z milionu bude lepší postup [#2], pro výběr 15 čísel z 20 bude lepší mnou uvedený postup. Pro výběr 5 čísel z 20 bych asi použil raději ten můj, zejména pokud se v budoucnu ten počet vybraných čísel může zvýšit.)
Tori
Profil
Joker:
pro výběr dvou čísel z milionu bude lepší postup [#2], pro výběr 15 čísel z 20 bude lepší mnou uvedený postup
Myslíte kvůli počtu průchodů pole (in_array) nebo z jiného důvodu? (Taky by to šlo ukládat jako klíče a za cyklem zavolat array_flip - isset by měla být rychlejší než in_array).
Jan Tvrdík
Profil
Tori:
O to vůbec nejde. Jde čistě o to, že to moje řešení nemusí teoreticky nikdy skončit resp. může trvat velmi dlouho. A ta pravděpodobnost, že se to stane, se zvyšuje v souladu s tím, co popisuje Joker.
Tori
Profil
Jan Tvrdík:
Aha, díky, nenapadlo.
Joker
Profil
Tori:
Myslíte kvůli počtu průchodů pole (in_array) nebo z jiného důvodu?
Svým způsobem.
Hlavně ale jak roste podíl vybraných čísel ku celému intervalu, u toho způsobu podle [#2] roste pravděpodobnost, že se vygenerované číslo trefí do nějakého vygenerovaného už dříve.
Na generování jednoho čísla z 20 bude vždy potřeba jeden cyklus, na vygenerování dvou v 95% případů dva a v 5% případů více (v 0,25% případů více než tři).
Čím víc vybraná čísla pokrývají ten interval, tím horší to bude, extrémní případ bude vygenerování všech 20 čísel v náhodném pořadí, kdy u posledního čísla budu mít v každém cyklu 95% pravděpodobnost, že bude nutné cyklus opakovat.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: