Autor | Zpráva | ||
---|---|---|---|
Micruss Profil |
#1 · Zasláno: 3. 1. 2013, 18:14:19
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 |
#2 · Zasláno: 3. 1. 2013, 18:22:53
Micruss:
1<?php <?php
$nahodnaCisla = array();
do {
$cislo = rand(1, 20);
if (!in_array($cislo, $nahodnaCisla)) $nahodnaCisla[] = $cislo;
} while (count($nahodnaCisla) < 5); |
||
Micruss Profil |
#3 · Zasláno: 3. 1. 2013, 18:32:12
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 |
#4 · Zasláno: 3. 1. 2013, 18:32:53
Viz třeba Neopakujicí se čisla..
1<?php <?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 |
#5 · Zasláno: 3. 1. 2013, 18:42:23
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 |
#7 · Zasláno: 3. 1. 2013, 18:49:35
Jan Tvrdík:
Aha, díky, nenapadlo. |
||
Joker Profil |
#8 · Zasláno: 3. 1. 2013, 18:57:30
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. |
||
Časová prodleva: 12 let
|
Toto vlákno je staré, již dlouho do něj nikdo nepřispíval.
Informace a odkazy zde uváděné už nemusejí být aktuální. Nechcete-li řešit zde uvedenou konkrétní otázku, založte si vlastní vlákno, nepište do tohoto. Vložíte-li sem nyní příspěvek, upoutáte pozornost mnoha lidí a někteří z nich si jen kvůli vám přečtou i všechny předcházející příspěvky. Předpokládáte-li, že váš text skutečně bude hodnotný, stiskněte následující tlačítko:
Běda vám, jestli to bude blábol.
0