Generátor náhodných čísel kromě

C++, C#, Visual Basic, Delphi, Perl a ostatní

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod demo1 22. 8. 2018 17:08

zdravím, nikde nemůžu najít generátor náhodných čísel, který by mě vygeneroval čísla dejme tomu od 1-50 kromě čísel 20-29. Může někdo poradit, kde ho najít? Díky moc všem za rady.
demo1
Kolemjdoucí

Odeslat příspěvekod suk 22. 8. 2018 17:14

A co si takovou vec napsat sam? Jsme v sekci "programovani" nebo v sekci "cargokulticke pouzivani knihovnich funkci"?

Treba vygenerovat cislo od nuly do 40 a k cislum >= 20 proste jen pricist desitku? Nebo uz je to prilis slozita matematika?
Pokud nesouhlasíte s mým názorem, popřemýšlejte sami nad sebou. Opravdu si myslíte, že já bych se mohl mýlit?
----
You are an inspiration for a birth control...
suk
Mírně pokročilý
Uživatelský avatar

Odeslat příspěvekod demo1 22. 8. 2018 18:33

nejsem programator..jen se tu ptam
demo1
Kolemjdoucí

Odeslat příspěvekod JirkaVejrazka 22. 8. 2018 22:54

A kolik bys tech nahodnych cisel potreboval?
JirkaVejrazka
Mírně pokročilý

Odeslat příspěvekod JanFiala 23. 8. 2018 05:50

Jednoduchá funkce, která bude generovat náhodné číslo a pokud bude v tom tvém rozsahu, tak ho zahodí a bude generovat další tak dlouho, než se trefíš.
Další možnost:
budeš generovat 2 rozsahy 1-19 a 30-50. Prvním generováním náhodného čísla si zvolíš rozsah, druhým vygeneruješ číslo z daného rozsahu. Kdybys měl oba rozsahy stejně velké, bylo by to ještě jednodušší.

Obě možnosti jsou na pár řádků kódu.
Co můžeš udělat dnes, odlož na včerejšek
JanFiala
Expert
Uživatelský avatar

Odeslat příspěvekod JirkaVejrazka 23. 8. 2018 07:06

Je to asi takhle slozite (napsano v Pythonu, generuje 6 nahodnych cisel):
Kód: Vybrat vše
from random import randint
nums = set()

while len(nums) < 6:
    x = randint(1,50)
    if not (20 <= x <= 29):
       nums.add(x)

print(sorted(nums))
JirkaVejrazka
Mírně pokročilý

Odeslat příspěvekod suk 23. 8. 2018 11:46

JanFiala, JirkaVejrazka: Vase odpovedi jsou spatne.

Zahazovat cisla v non-kryptografickem prostredi problem neni, stejne tak pokud je mnozina chtenych a nechtenych cisel podobne velka.

Nicmene, v okamziku, kdy budu treba chtit generovat z prvnich a poslednich 50 cisel mezi nulou a milionem, tak tech "zahazovacich" cyklu probehnou desitky tisic. Koneckoncu, i pravdepodobnost, ze se objevi milion cisel ze "zakazaneho rozsahu" po sobe je take nenulova.

Vygenerovanim cisel z jednoho nebo druheho rozsahu (pokud jsou ty rozsahy rozdilne velike) se zase porusi teoreticke rovnomerne rozdeleni pravdepodobnosti.

Proto misto zbytecne sloziteho a nespolehliveho algoritmickeho reseni doporucuju pouzit moje ciste aritmeticke.

Obrázek
Pokud nesouhlasíte s mým názorem, popřemýšlejte sami nad sebou. Opravdu si myslíte, že já bych se mohl mýlit?
----
You are an inspiration for a birth control...
suk
Mírně pokročilý
Uživatelský avatar

Odeslat příspěvekod JirkaVejrazka 23. 8. 2018 12:30

Hm, diky za pripominku. On tady nekdo mluvil o generovani cisel z milionoveho rozsahu? Pri jinem zadani by pochopitelne byl take jiny algoritmus...

A to aritmeticke reseni neni tvoje. Je z XKCD a tyka se chyby pri generovani nahodnych cisel v Debianim OpenSSL ;-)
JirkaVejrazka
Mírně pokročilý

Odeslat příspěvekod zivan 23. 8. 2018 13:06

Ale i ty musis uznat, ze vygenerovat 50x nahodne cislo a k casti z toho pricist 10 je mnohem elegantnejsi, nez jich generovat treba 200 a 3/4 zahodit.

A pro autora vlakna - takovy "generator" je treba v Excelu, staci na X radku prvniho sloupce napsat vzorec "=ZAOKROUHLIT(NÁHČÍSLO()*40;0)", do vedlejsiho "=KDYŽ(A1>=20;A1+10;A1)" a mas ty pozadovana cisla.
Naposledy upravil zivan dne 23. 8. 2018 13:16, celkově upraveno 1
Lenovo Moto G5 Plus, Lenovo Thinkpad X220 (12,5" IPS, i5-2410, 16GB RAM, 500GB mSata Samsung 850 EVO + 1TB Samsung HDD) + 29" LG 29UM65 + 22" Eizo S2202W
zivan
Junior

Odeslat příspěvekod suk 23. 8. 2018 13:10

Tazatel ovsem nerikal, k cemu to hodla pouzivat a cisla byla uvedena jako nejaky priklad. Mozna milionova cisla pouzivat hodla, mozna ne, to nevime. A koneckoncu, nemusime chodit do milionu - pro cisla 1 - 50, kde vynechame 5 - 45 ten algoritmus pro vygenerovani 6 cisel probehne 30x - 100x. 24 az 94 zbytecnych volani knihovni funkce, pokud by to vyuzivalo systemem nasyslenou entropii, tak i jeji bohapuste plytvani.

Proto rikam, ze vase reseni jsou spatna - protoze existuje "algoritmus", ktery je obecny (at uz jde o desitky nebo miliardy miliard) ale predevsim i jednodussi a v mnoha pripadech bude i rychlejsi. Je mi jasne, ze "moje" reseni nebude asi uplne "moje", tuto formulaci, prosim, chapej jako "mnou nabidnute" ;)

PS: Ja uznavam, ze v urcitych pripadech muze byt takove quick&dirty reseni fajn, ale myslim, ze tady na foru v sekci "programovani" bychom mohli nabizet edukativnejsi a spravna reseni, ne? :)

PS2: Mohu poprosit o ten XKCD? (Nepodarilo se mi to vygooglit)
Pokud nesouhlasíte s mým názorem, popřemýšlejte sami nad sebou. Opravdu si myslíte, že já bych se mohl mýlit?
----
You are an inspiration for a birth control...
suk
Mírně pokročilý
Uživatelský avatar

Odeslat příspěvekod JirkaVejrazka 23. 8. 2018 13:26

https://xkcd.com/221/ EDIT - pardon, myslel jsem, ze "tvoje reseni" je na tom obrazku - nejak jsem nezaregistroval tvuj algoritmus o par prispevku vyse.

"který by mě vygeneroval čísla dejme tomu od 1-50 kromě čísel 20-29"
JirkaVejrazka
Mírně pokročilý

Odeslat příspěvekod JirkaVejrazka 23. 8. 2018 15:12

Tak mi to nedalo a zkusil jsem obe metody. Jak tu moji (zahazovani cisel), tak tvoji (pricitani desitky).

Nechal jsem obe verze probehnout v cyklu desetmilionkrat, kvuli lepsi presnosti mereni. Pak jsem meril cas, za jak dlouho desetmilionkrat dobehne jedna verze, pak druha verze. Mereni jsem provedl cca patnackrat, nenasel jsem zadne rozdily v rychlosti.

Nedalo mi to a zkusil jsem nahodne vybirat 30 cisel ze 40 obema metodami (aby se casteji "zahazovalo"). Zadny rozdil.

Nakonec jsem udelal to co navrhujes. Dal jsem vybirat cisla od jedne do deseti a od ctyriceti do padesati, obema metodami. Muj algoritmus tedy casteji "zahazuje". Ani tady na deseti milionech cyklu nebyl zadny meritelny rozdil. (pro info - na mem notebooku kazda verze probehla za cca 1,3 az 1,4 sekundy pro tech deset milionu cyklu).

Tak jsem zkusil jeste posledni vec - spustil jsem to pod jinymi interpretrem Pythonu, ktery je optimalizovany pro casto opakovane ulohy. Zase zadny meritelny rozdil, cas behu pro obe verze cca 0,015 sekundy.

Za mne jsou tedy oba algoritmy ekvivalentni s tim, ze muj ne podle mne o trochu citelnejsi, protoze presne kopiruje zadani uzivatele ;-)

EDIT: kod na pozadani muzu poskytnout pro nezavisly test :)

EDIT2: zkusil jsem jeste vybirat dvacet cisel z milionu. V tomhle pripade uz je tvuj algoritmus opravdu rychlejsi, cca o 20-30%.
JirkaVejrazka
Mírně pokročilý

Odeslat příspěvekod suk 23. 8. 2018 15:24

JirkaVerjazka: v tom mereni bude nejaky hacek, uz jenom mnohanasobne volani funkce by melo trvat dele, nez dve aritmeticke operace a i v pripade nainlinovani celeho randintu bych ocekaval, ze randint bude slozitejsi, nez jsou dve secteni. Zkusim to (kdyz najdu cas a chut to udelat) v cecku nebo jinem jazyce. A porad to nic nemeni na tom, ze je to neefektivni a nevhodny zpusob :)

Ohledne zadani zase (pro zmenu :D ) nesouhlasim, nebot uzivatel se neptal, jak filtrovat nahodna cisla, nybrz je chtel generovat.
Pokud nesouhlasíte s mým názorem, popřemýšlejte sami nad sebou. Opravdu si myslíte, že já bych se mohl mýlit?
----
You are an inspiration for a birth control...
suk
Mírně pokročilý
Uživatelský avatar

Odeslat příspěvekod JirkaVejrazka 23. 8. 2018 15:32

randint se prece nemeni, volas ho porad. Jenom se meni ten interval, ze ktereho generujes ta nahodna cisla. Na tom nic zasadne neusetris.

Ale samozrejme si to zkus sam...
JirkaVejrazka
Mírně pokročilý

Odeslat příspěvekod JanFiala 24. 8. 2018 05:52

suk píše:JanFiala, JirkaVejrazka: Vase odpovedi jsou spatne.

Zahazovat cisla v non-kryptografickem prostredi problem neni, stejne tak pokud je mnozina chtenych a nechtenych cisel podobne velka.

Nicmene, v okamziku, kdy budu treba chtit generovat z prvnich a poslednich 50 cisel mezi nulou a milionem, tak tech "zahazovacich" cyklu probehnou desitky tisic. Koneckoncu, i pravdepodobnost, ze se objevi milion cisel ze "zakazaneho rozsahu" po sobe je take nenulova.


Navrhoval jsem i reseni, ktere by zadna cisla nezahazovalo. Poprve bys zvolil rozsah a podruhe vygeneroval cislo. Takze vzdy jen a pouze 2 generování nahodneho cisla a je uplně jedno, jak velké by intervaly byly :-P
Co můžeš udělat dnes, odlož na včerejšek
JanFiala
Expert
Uživatelský avatar

Další stránka

Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 0 návštevníků