Autor Zpráva
Pitt
Profil *
Ahoj všichni..
Potřebuju poradit, jak sprovoznit skript na generování náhodných čísel, které se NESMÍ opakovat.. Tady v diskusy nic takového není.. Jen generování.. Ale je to bez kontroly na výskyt duplicitních hodnot.

Dám příklad:
Tah čísel: 1-30 a chci z nich 5 vytáhnout, aby nebyly stejný.. Moc děkuju za pomoc!! Trápím se s tím už pár dní a pořád nevím..
habendorf
Profil
Dělal jsem to jednou, ale v JS. Vygenerovaná čísla jsem si ukládal do pole a při každém dalším vygenerování jsem to pole cyklem projel a testoval jeho hodnoty na rovnost s právě vygenerovanou.
Pitt
Profil *
Takže ten skript asi nikde nenajdeš ;)
S JS nemám moc zkušeností.. A už vůbec ne s propojením PHP a JS.. Výsledek potom potřebuju uložit do databáze.
habendorf
Profil
Což o to, já ho najdu, ale ty chceš php. Nicméně logika je stejná, jiná je jen syntaxe.
mila
Profil
Tady je asi jedno v jakém jazyce se to bude psát, jde o ten algoritmus.

Jedna možnost je asi testovat po každém vygenerovaném číslu, zda už v poli je, jak psal habendorf. Moc se mi to ale nelíbí. Může to běžet docela dlouho, když to bude dávat čísla, co tam už jsou.

Druhá možnost je udělat si zásobník čísel, a pak vybírat z něj. Když je číslo vylosováno, tak se v něm smaže.
habendorf
Profil
mila: To je sice pravda, ale jde-li o 5 z 30, tak bych volil to moje. Pokud by šlo o 25 z 30, tak to tvoje.
Pitt
Profil *
habendorf: jj jde mi spíš o php, ale klidně mi to písni v javě.. Třeba začnu přemýšlet a nějak to už dám do kupy..

mila: Nevidím v tom žadánou časovou náročnost.. v php to mám vyřešený takhle..

//$rnd.. nahodne vygenerovane cislo
//$cis.. pole, ktere by melo postupne obsahovat tech 5 nahodnych cisel..

if(!in_array($rnd,$cis)){

//Tady by mel byt nejaky prikaz pro pridani znovugenerovaneho cisla do pole.. Ale fakt nevim jak na to:(

}
habendorf
Profil
http://www.1-webdesign.cz/pokusy/sportka.html

Je to sportka, takže 6 ze 49, ale to už si upravíš. Ještě je tam udělaný řazení vygenerovaných čísel podle velikosti, to z toho můžeš vyhodit.
Pitt
Profil
habendorf
Díky aspoň za to.. Půjdu spát a zítra to ještě nějak zkusím obejít přes php.. Furt si ještě věřim :))))

Kdybyste někdo měl něco podobnýho v php, tak pište.. ;) Brou
zivan
Profil
Udelal bych si pole povolenych cisel, vygeneroval nahodny index, cislo ulozil do pole vybranych cisel a smazal ho z povolenych. Pri dalsim generovani by bylo o jeden index mene.
jardab
Profil *

//pomocna funkce pro inicializaci generatoru z www.php.net
function make_seed()
{
list($usec, $sec) = explode(' ', microtime());
return (float) $sec + ((float) $usec * 100000);
}
srand(make_seed());

$tah = array();
while (1) {
$nahoda = rand(1, 30);
if (!in_array ($nahoda, $tah)) {
$tah[] = $nahoda;
if (sizeof ($tah)==5)
break;
}
}

var_dump ($tah);
mila
Profil
Co takhle zkusit použít fce php?

$pocet = 5; // kolik tahnu
$max = 40; // z kolika tahnu
// vytvořím si pole s klíči 1..$max, hodnoty mě nezajímají
$a = array_fill(1, $max, null);
// a vyberu z něj požadovaný počet
$res = array_rand ( $a, $pocet );
// teď to jen vypíšu
foreach ($res as $value) {
echo $value, ', ';

}


Algoritmus, který doufá, že náhodná čísla budou příjemná a bude tedy moci skončit se mi nelíbí. Viděli jste někdy kolikrát po sobě může na ruletě padnout červená?
zivan
Profil
Nemuze fce array_rand vratit nektery klic vicekrat? V manualu jsem to nenasel.

EDIT: Tak jsem to testnul a nevraci. Problem tedy elegantne vyresen.
Toto téma je uzamčeno. Odpověď nelze zaslat.

0