ahojte,
chcem vas poprosit o radu. Ako by ste generovali nahodne cisla tak aby sa neopakovali. Diky.
Fórum › C / C++
Rand() bez opakovania
#include <iostream>
#include <set>
#include <ctime>
#include <iterator>
int main()
{
std::srand(std::time(0));
std::set<int> s;
/*pozor, aby losovany interval nebyl mensi nez velikost mnoziny(hrozi zacykleni)*/
for(;s.size() < 10;)
s.insert(std::rand()%(20-5+1)+5);
std::copy(s.begin(),s.end(), std::ostream_iterator<int>(std::cout, "\n"));
return 0;
}
To Jura : no, mnoziny este neviem pouzivat. :), ja som myslel na take nieco, ze by sa nahodne vygenerovane cislo ulozilo do pomocneho pola. pri dalsom generovani by sa skontrovali predchadzajuce prvky v poli ci tam uz take, ako sa prave vygenerovalo, nie je. Ak sa opakuje, tak generuj znova.
To mbohus : no to je takovy docela nevyhodny, protoze pri kazdym generovani musis prochazet az cely pole znovu a to je neefektivni... tam by se hodila upravka treba dalsi pomocny pole a do nej se divat hashovaci funkci, a nebo aspon binarni strom se setridenejma cislama...
To tmi :
Otázkou ale stále zůstává jak velké to pole bude, pokud to bude pro malé N, tak ve sekvenčním hledání nevidím problém(navíc se mi to zdá jako zadání domacího úkolu), pokud velká N, tak to je o něčem jiném. Nicméně k tomu by se měl spíše vyjádřit autor příspěvku.
Lepšie by bolo mať pole so všetkymi čislami a pomocou nahodneho generatora vzajomne povymieňať prvky
int pole[] = {1,2,3,4,5;6};
for (int i = 0; i < 20;i++)
swap(pole[rand(6)],pole[rand(6)]);
//-----------
for (int i = 0;i < 6;i++)
cout << "otazka cislo " << pole[i];
pozn. funkcia
int rand(int max)
a
swap(int,int)
su len pseudo, takže rand musiš vyriešiť aby generovalo v intervale a swap aby naozaj vymieňalo. buď pomocnu premennú alebo pomocou pointerov.
To mephi [#52952]: zajimavy a efektivni napad... ale nevim proc je tam ten cyklus 20krat? aby to bylo nahodnejsi? to si myslim ze je zbytecne. pokud provedes prave n prohozeni nahodnych pozic, pravdepodobnost ze se posloupnost nezmeni je totiz pro licha n (n je interval nah.cisel) nulova a pro suda n mas celkem ((n nad 2) na k) moznosti, pricemz tech ktere posloupnost nezmeni je (nechtelo se mi to pocitat tak jen priblizne) tolik, na kolik mocnin dvojky muzes (n nad 2) rozlozit, tedy ((n nad 2)/2)krat nejake permutace. abych byl konkretnejsi, pro n=4 je pravdepodobnost ze se nic nezmeni priblizne 0.05 (kombinaci jak nic nezmenit bylo 76, celkovych 1296) coz je akceptovatelne (pocitam ze funkce rand prideluje cisla rovnomerne).
...hmm az ted mi doslo ze tech prohozeni staci jen n/2... ale znovu to pocitat nechci... na vysledek by to vsak zasadni vliv nemelo.
aha s tim sem nepocital, ale pak by tam akorat misto (n nad 2) bylo (n + 1 nad 2)... hmm ale tech spatnejch prikladu je o dost vic, pravda... uz se mi to nechce pocitat stejne to nikoho moc nezajima)... ale na druhou stranu to si muzes podminkou pohlidat aby ty dve cisla nebyla stejny, to by bylo celkem v pohode... jako programator bych to ale vyresil asi tak ze bych ten pocet konanejch prohozeni postupne zvysoval a pro kazdy bych dejme tomu na 1000 pokusech udelal statistiku, a u ceho uz by byla prijatelne tak to bych zvolil... proc nevyuzit pocitac kdyz uz ho mame ze
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Nieco ako TreeSet s moznostou opakovania prvkov — založil nail
Funkcia rand / srand — založil street punk
Zobrazení duplicit bez seskupení ( bez GROUP BY) — založil pidgin
Moderátoři diskuze