Prosíme přihlašte se nebo zaregistrujte.

Přihlašte se svým uživatelským jménem a heslem.
Vaše pomoc je stále potřeba!

Autor Téma: generovani nahodneho **bigintu  (Přečteno 2693 krát)

ntz_reloaded

  • Lokaj
  • Závislák
  • ***
  • Příspěvků: 3735
  • skill :: ur home erly
generovani nahodneho **bigintu
« kdy: 07 Srpna 2012, 16:14:54 »
ahoj,

potrebuju nejak generovat pomerne velky int .. tedy linearne v rozsahu 0..$max .. nejakej napad ?

ps. v perlu jsem to vzdal, mam napsanej nejakej code co pocita v base 36 (man strtol ## eg c verze) az do velikosti "zzzzzz", tedy:

Kód: (2176782335) [Vybrat]
use bigint;

my @base = (0..9, 'a' .. 'z');
my $len = 6;
my $max = ($#base+1)**$len-1;

diky a zdravim, ntz
tikejte mi, taky Vam tikam ...
song of the day - openSUSE, openindiana, DuckDuckGo
The noise ain't noise anymore, who's to blame, WHO'S TO BLAME ??

pacholik

  • Závislák
  • ***
  • Příspěvků: 2072
Re:generovani nahodneho **bigintu
« Odpověď #1 kdy: 07 Srpna 2012, 17:23:06 »
Kód: [Vybrat]
>>> import random
>>> random.randrange(0, 10**1000)

ntz_reloaded

  • Lokaj
  • Závislák
  • ***
  • Příspěvků: 3735
  • skill :: ur home erly
Re:generovani nahodneho **bigintu
« Odpověď #2 kdy: 07 Srpna 2012, 18:06:26 »
Kód: [Vybrat]
>>> import random
>>> random.randrange(0, 10**1000)
wt* ? :D
tikejte mi, taky Vam tikam ...
song of the day - openSUSE, openindiana, DuckDuckGo
The noise ain't noise anymore, who's to blame, WHO'S TO BLAME ??

pacholik

  • Závislák
  • ***
  • Příspěvků: 2072
Re:generovani nahodneho **bigintu
« Odpověď #3 kdy: 07 Srpna 2012, 19:52:05 »
python...
Nebo jsem (opět :D) nepochopil co po mě chceš?

MaSo_CZ

  • Návštěvník
  • Příspěvků: 54
Re:generovani nahodneho **bigintu
« Odpověď #4 kdy: 07 Srpna 2012, 20:10:09 »
já bych přidal něco v BASHi, nemusí to být 100% použitelné pro tvůj účel, ale může nakopnout/pomoct někomu dalšímu... :)

1. pomoci "proměnné" $RANDOM, která generuje číslo 0-32767 (15 bitů) + rozšíření, ale vždy jen v plném "bitovém rozsahu", tedy např. 16b -> 0-65535. Pro menší horní hranici stačí jen vydělit výsledek vhodným číslem (u velkých čísel již může být problém se zaokrouhlováním a tedy i chybnými výsledky - nezkoušeno!) a event. přípočet číslem, které určuje spodní hranici rozsahu:

Kód: [Vybrat]
echo $RANDOMje-li potřeba 16b (0-65535):
Kód: [Vybrat]
echo $(( (($RANDOM)/16384)*32768 + $RANDOM ))17b:
Kód: [Vybrat]
echo $(( (($RANDOM)/8192)*32768 + $RANDOM ))18b:
Kód: [Vybrat]
echo $(( (($RANDOM)/4096)*32768 + $RANDOM ))...
30b:
Kód: [Vybrat]
echo $(( ($RANDOM*32768 + $RANDOM ))32b (int):
Kód: [Vybrat]
echo $(( ($RANDOM/8192)*(1<<30) + $RANDOM*32768 + $RANDOM ))nebo (s tímto systémem se bude dále pokračovat - pro základ/krok po 16b):
Kód: [Vybrat]
echo $(( ((($RANDOM)/16384)*32768 + $RANDOM)*65536 + (($RANDOM)/16384)*32768 + $RANDOM ))48b:
Kód: [Vybrat]
echo $(( ((($RANDOM)/16384)*32768 + $RANDOM)*(1<<32) + ((($RANDOM)/16384)*32768 + $RANDOM)*65536 + (($RANDOM)/16384)*32768 + $RANDOM ))64b (double/??bigint??):
Kód: [Vybrat]
echo $(( ((($RANDOM)/16384)*32768 + $RANDOM)*(1<<48) + ((($RANDOM)/16384)*32768 + $RANDOM)*(1<<32) + ((($RANDOM)/16384)*32768 + $RANDOM)*65536 + (($RANDOM)/16384)*32768 + $RANDOM ))
Postup je v podstatě stejný, jak když se "manuálně" převádí mezi desítkovou a např. šestnáctkovou soustavou

př. rozsah 50 - 150:
Kód: [Vybrat]
echo $(($RANDOM/327+50))327 vzniklo: 32767 (max. rozsah random funkce - viz skripty výše) / 100 (požadovaný rozsah - použít jen celé číslo bez desetin...)

2. pomoci "zařízení" /dev/urandom generující řetězec v plném rozsahu bajtů 0x00-0xFF (0-255), který se "ustřihne" pomoci příkazu head a rozsah znaků omezí pomoci příkazu tr:

vygeneruje 5 místné číslo (00000-99999)
Kód: [Vybrat]
tr -dc 0-9 < /dev/urandom | head -c 5vygenerované číslo obsahuje číslice 0-9...
v některých případech bude možná vhodnější vygenerovat binární (dvojkové) číslo:
Kód: [Vybrat]
tr -dc 0-1 < /dev/urandom | head -c 64Vygenerované číslo je 64b (viz. příkaz head) a výsledek je však nutno převést z binárního na desítkové pro další vhodné použití ve skriptech

zdroj: http://www.cyberciti.biz/faq/linux-random-password-generator/

Pokud jsou tu nějaké chyby, děkuji za upozorněni... :)
desktop: AMD FX-8120 & CRUCIAL 8GB (kit 2x 4GB) Ballistix Tactical 1866MHz @ ASUS M5A88-V EVO: Ubuntu 12.04/64b
server:    AMD Duron@1400MHz: Debian v6

Martin Šácha

  • Člen občanského sdružení Ubuntu ČR a placené komunitní podpory
  • Administrátor fóra
  • ******
  • Příspěvků: 5153
Re:generovani nahodneho **bigintu
« Odpověď #5 kdy: 07 Srpna 2012, 21:11:41 »
Záleží na tom, jak moc náhodný to má být - jestli ti stačí urandom nebo s pomocí hw (triviálně zapojit repráky do inputu).

Urandom není příliš náhodný, udělej nad ním ještě nějaký hash (sha-512,whirlpool,...). Takový hash už je dost velký (a *nepředvídatelný) int...
« Poslední změna: 07 Srpna 2012, 21:13:22 od Martin "sachy" Šácha »
Mint MATE 64bit / DuckDuckGo.com
Programátoři považují WYSIWYG za špatné u kódu i u žen. Programátor chce "dostat to, co žádá“ – kód tajemný, neodpouštějící, nebezpečný.

ntz_reloaded

  • Lokaj
  • Závislák
  • ***
  • Příspěvků: 3735
  • skill :: ur home erly
Re:generovani nahodneho **bigintu
« Odpověď #6 kdy: 07 Srpna 2012, 21:45:50 »
diky za odpovedi ..

ted me v bille u nakupu neco napadlo ... jak hodne je linear kdyz budeme randomovat nekolikrat 0..9 a proste se to posklada, takze pripadne *leading zeros* se oriznou:

Kód: [Vybrat]
# perl -E '$x .= int(rand(10)) for(1..22); say $x'
6923452809738087104806

^^ matematik jsem velmi slabej a sestej smysl mi rika, ze to moc linearni asi nebude ..

tikejte mi, taky Vam tikam ...
song of the day - openSUSE, openindiana, DuckDuckGo
The noise ain't noise anymore, who's to blame, WHO'S TO BLAME ??

daysleeper

  • Stálý člen
  • **
  • Příspěvků: 1206
Re:generovani nahodneho **bigintu
« Odpověď #7 kdy: 07 Srpna 2012, 22:19:37 »
Kód: [Vybrat]
# perl -E '$x .= int(rand(10)) for(1..22); say $x'
6923452809738087104806

^^ matematik jsem velmi slabej a sestej smysl mi rika, ze to moc linearni asi nebude ..
To je podle mě elegantní řešení, ale záleží na kvalitě perlovského generátoru náhodných čísel, seedu a algoritmu zaokrouhlení náhodných čísel na celá čísla v intervalu <0,9>. 

Například v jednoduchém bashovském stylu
Kód: [Vybrat]
for i in {1..1000000}; do echo $(($RANDOM % 10)) >> /tmp/r.txt; done
sort /tmp/r.txt | uniq -c | sort -rn
nebude rozložení v intervalu <0,9> úplně náhodné (číslo 4 se vyskytuje častěji než 5, důvod nechávám jako cvičení pro čtenáře ;))

Petr Merlin Vaněček

  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 5057
    • Lomítkáři
Re:generovani nahodneho **bigintu
« Odpověď #8 kdy: 08 Srpna 2012, 07:36:17 »
Btw. NTZ, ty ses dal na studium nějaké šílené MUNI, CUNI nebo snad ZČU, že řešíš v poslední době samé takové krásy? :)
Stiskni CTRL + W ...
80% mozku tvoří kapalina ... u některých brzdová

ntz_reloaded

  • Lokaj
  • Závislák
  • ***
  • Příspěvků: 3735
  • skill :: ur home erly
Re:generovani nahodneho **bigintu
« Odpověď #9 kdy: 08 Srpna 2012, 10:52:59 »
Btw. NTZ, ty ses dal na studium nějaké šílené MUNI, CUNI nebo snad ZČU, že řešíš v poslední době samé takové krásy? :)
:D ne ..

jen se snazim - kdyz uz teda *sometimes neco programuju - to delat poradne .. ;)

samozrejme, ze prototypy jsou ubastlene *tak, aby to nejak slo*, ale zpetne je nahrazuju optimalizovanym resenim .. petre, dyk ty me znas: rekni, no nemam v te hlave *nasr*no ? ja bych rekl ze znacne. jsem pomerne dost hloupej a muzu rict, ze nekterym z Vas zavidim ta matematicka *myslidla

zdravim, ntz

ps - ted jsem na urovni mluviciho papouska .. protoze furt pisu v anglictine, tak posledni rok na sobe sleduju, ze uz i v te cestine zacinam pouzivat anglickej slovosled .. vsechno si po sobe musim cist, abych to opravil a nevypadal jak idiot .. a v te anglictine mi obcas nekdo vytkne, ze ten slovosled mam sem tam **podivne
« Poslední změna: 08 Srpna 2012, 10:58:00 od ntz_reloaded »
tikejte mi, taky Vam tikam ...
song of the day - openSUSE, openindiana, DuckDuckGo
The noise ain't noise anymore, who's to blame, WHO'S TO BLAME ??

RNA

  • Stálý člen
  • **
  • Příspěvků: 630
Re:generovani nahodneho **bigintu
« Odpověď #10 kdy: 11 Srpna 2012, 00:16:43 »
Pro generování náhodných čísel používám algoritmus RC4, lehce modifikovaný a s velikostí S-boxu 4096 x 12 bitů.
Chcete to poslat?

 

Provoz zaštiťuje spolek OpenAlt.