Fórum Ubuntu CZ/SK
Ubuntu pro osobní počítače => Software => Příkazový řádek a programování pro GNU/Linux => Téma založeno: ntz_reloaded 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:
use bigint;
my @base = (0..9, 'a' .. 'z');
my $len = 6;
my $max = ($#base+1)**$len-1;
diky a zdravim, ntz
-
>>> import random
>>> random.randrange(0, 10**1000)
-
>>> import random
>>> random.randrange(0, 10**1000)
wt* ? :D
-
python...
Nebo jsem (opět :D) nepochopil co po mě chceš?
-
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:
echo $RANDOM
je-li potřeba 16b (0-65535):
echo $(( (($RANDOM)/16384)*32768 + $RANDOM ))
17b:
echo $(( (($RANDOM)/8192)*32768 + $RANDOM ))
18b:
echo $(( (($RANDOM)/4096)*32768 + $RANDOM ))
...
30b:
echo $(( ($RANDOM*32768 + $RANDOM ))
32b (int):
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):
echo $(( ((($RANDOM)/16384)*32768 + $RANDOM)*65536 + (($RANDOM)/16384)*32768 + $RANDOM ))
48b:
echo $(( ((($RANDOM)/16384)*32768 + $RANDOM)*(1<<32) + ((($RANDOM)/16384)*32768 + $RANDOM)*65536 + (($RANDOM)/16384)*32768 + $RANDOM ))
64b (double/??bigint??):
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:
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)
tr -dc 0-9 < /dev/urandom | head -c 5
vygenerované číslo obsahuje číslice 0-9...
v některých případech bude možná vhodnější vygenerovat binární (dvojkové) číslo:
tr -dc 0-1 < /dev/urandom | head -c 64
Vygenerované čí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/ (http://www.cyberciti.biz/faq/linux-random-password-generator/)
Pokud jsou tu nějaké chyby, děkuji za upozorněni... :)
-
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...
-
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:
# 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 ..
-
# 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 stylufor 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 ;))
-
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? :)
-
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
-
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?