Rand() bez opakovania – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Rand() bez opakovania – C / C++ – Fórum – Programujte.comRand() bez opakovania – C / C++ – Fórum – Programujte.com

 

mbohus0
Duch
27. 10. 2007   #1
-
0
-

ahojte,
chcem vas poprosit o radu. Ako by ste generovali nahodne cisla tak aby sa neopakovali. Diky.

Nahlásit jako SPAM
IP: 213.151.217.–
Jura
~ Anonymní uživatel
637 příspěvků
27. 10. 2007   #2
-
0
-

V C++ ukládali do set, v C bychom si napsali množinu sami.

Nahlásit jako SPAM
IP: 85.207.192.–
mbohus0
Duch
27. 10. 2007   #3
-
0
-

btw, viem ako nato, ale najviac by mi pomohlo keby ste tu niekto pastli ten kusok kodu, moze byt aj nejaky pseudo kod...proste len chcem vidiet postupnost prikazov... diky

Nahlásit jako SPAM
IP: 213.151.217.–
mbohus0
Duch
27. 10. 2007   #4
-
0
-

v C++

Nahlásit jako SPAM
IP: 213.151.217.–
Jura
~ Anonymní uživatel
637 příspěvků
27. 10. 2007   #5
-
0
-



#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;
}

Nahlásit jako SPAM
IP: 85.207.192.–
mbohus0
Duch
27. 10. 2007   #6
-
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.

Nahlásit jako SPAM
IP: 213.151.217.–
yaqwsx+9
Posthunter
27. 10. 2007   #7
-
0
-

To mbohus :
NO pokud umis generovat nahodne cislo,tak to bys sis mel umet doplnit sam

Nahlásit jako SPAM
IP: 85.160.115.–
Life is too short to remove USB mass storage safely...
Správný drsňák udělá z konzole cokoliv
tmi0
Věrný člen
27. 10. 2007   #8
-
0
-

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...

Nahlásit jako SPAM
IP: 89.185.230.–
ksp.mff.cuni.cz -- doporučuje 5 z 0 přetečených bufferů!
mephi0
Expert
27. 10. 2007   #9
-
0
-

generuj nahodne čilo
ak už bolo generuj ďalšie
ak nie použi toto
ak už boli všetky koniec

Nahlásit jako SPAM
IP: 85.248.56.–
Program nemusi fungovat rychle, staci ze funguje dostatecne rychle.
Jura
~ Anonymní uživatel
637 příspěvků
27. 10. 2007   #10
-
0
-

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.

Nahlásit jako SPAM
IP: 85.207.192.–
mephi0
Expert
27. 10. 2007   #11
-
0
-

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.

Nahlásit jako SPAM
IP: 85.248.56.–
Program nemusi fungovat rychle, staci ze funguje dostatecne rychle.
mbohus0
Duch
27. 10. 2007   #12
-
0
-

To Jura : ano je to zadanie do skoly. N je male cislo... dajme tomu od 0 do 5.

Nahlásit jako SPAM
IP: 213.151.217.–
mbohus0
Duch
27. 10. 2007   #13
-
0
-

To mbohus : riesenie by aj bolo...rekurzivna funkcia..a to ze sa bude prehladavat pole dokola je neefektivne, to je jasne. mna by ale zaujimalo ci by to neslo nerekurzivnou funkciou

Nahlásit jako SPAM
IP: 213.151.217.–
mbohus0
Duch
27. 10. 2007   #14
-
0
-

alebo jednoduchsie to poviem: mam pole cisel, v ktorom je kazde cislo len raz a proste chcem tie cisla pomiesat... ako na to?

Nahlásit jako SPAM
IP: 213.151.217.–
mbohus0
Duch
27. 10. 2007   #15
-
0
-

To mephi : no asi taketo nieco som hladal, diky

Nahlásit jako SPAM
IP: 213.151.217.–
tmi0
Věrný člen
27. 10. 2007   #16
-
0
-

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.

Nahlásit jako SPAM
IP: 89.185.230.–
ksp.mff.cuni.cz -- doporučuje 5 z 0 přetečených bufferů!
mephi0
Expert
28. 10. 2007   #17
-
0
-

To tmi :
len tak som strelil.
ide o to že niekedy monžo nastane swap prvku s tym istym, tak preto radšej viac.

Nahlásit jako SPAM
IP: 85.248.56.–
Program nemusi fungovat rychle, staci ze funguje dostatecne rychle.
tmi0
Věrný člen
28. 10. 2007   #18
-
0
-

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

Nahlásit jako SPAM
IP: 89.185.230.–
ksp.mff.cuni.cz -- doporučuje 5 z 0 přetečených bufferů!
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 59 hostů

Podobná vlákna

Rand() — založil dalaman

Rand? — založil JouiBart

Funkcia rand / srand — založil street punk

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý