véletlen számok dash-ban hogyan?

Sziasztok, a témám az, hogy véletlen számokat szeretnék kapni a lehető legalacsonyabb szintű eszközökkel dash-ban, lehetőleg csak belső eszközöket használva.

egy véletlen sztringet tudok olvasni:

#/bin/dash
read adag </dev/urandom;
echo $adag

Induljunk ki abból, hogy van egy sztringem, ami 0-nál több karaktert tartalmaz

Ki milyen nagy okosságot tudna adni arra, hogy hogyan tudnék véletlen számokat kapni csak a dash belső eszközeivel?

Hozzászólások

Egyrészt hol van a "belső eszköz" határa, másrészt meg nem teljesen mindegy, hogy mennyi kell és milyen gyorsan.

Ja, és tőlem kiindulhatunk abból, hogy van egy karakterláncod nullánál több karakterrel, de akkor mi van? Ez most egyáltalán jó vagy rossz hír? :-)

---
Science for fun...

Perl, Python, Lua egyike sincs?

$ python3
>>> import random
>>>
>>> random.randint(1,90)
5
>>> random.randint(1,90)
33

$ perl -e 'print int(rand(89)+1)'

#!/usr/bin/lua

math.randomseed(os.time())
print (math.random(1,90))
print (math.random(1,90))

Illetve ha dash helyett bash is jó: echo $RANDOM

hát a mennyiségről és sebességről csak annyit tudok mondani, hogy amit a vas ki tud tolni, szóval lehet csak arra gondolni, hogy "szeretnék egy véletlen számot" :)

tehát az itt az igazi kérdés először, hogy egyáltalán hogy tudok persze, lehetőleg gyorsan 1 darab véletlen számot kapni a nélkül, hogy lehetőleg bármilyen egyéb telepített külső futtatható segédprogramot meg kéne hívnom

Milyen véletlen szám kell és milyen eloszlásban?

0 és 1 közötti lebegőpontos, 0 és valamilyen MAX közötti egész?

Egyenletes eloszlás? Normális eloszlás? Poisson-eloszlás?

Nagyon aluldefiniált a probléma.

Mármint elég neked egy random bit?
Na, az tök jó, csak milyen eloszlásban?

Az kell neked, hogy várhatóan ugyanannyi 0 legyen, mint 1? Ez egy egyenletes eloszlás.

Vagy az is jó, ha 1 millióból 400 ezerszer 0 van, és 600 ezerszer 1? Ez is egy értelmes diszkrét eloszlás.
Esetleg más kell?
Sokféle diszkrét eloszlás van, a nekik megfelelő tulajdonságokkal.
http://www.ngkszki.hu/~trembe/nev_eloszl/nev_eloszl.htm
https://math.bme.hu/~nandori/Virtual_lab/stat/dist/Discrete.xhtml

A /dev/random, /dev/urandom random byte-ot ad neked vissza, karakteres eszköz. Ezt olvashatod, és megnézheted az első bitjét például, ha random bitet akarsz.
Viszont ez nem biztos, hogy teljesen jó lesz neked, megpróbáltam utánanézni, de sehol nem specifikált, hogy a /dev/{u}random milyen eloszlású véletlent generál, ez azért egy picit aggasztó.

De aritmetikai kifejezés kiértékelés igen. Szóval echo $(( kifejezés ))
Mondjuk ha nem csak abba az irányba menne a dash, hogy elérje a POSIX-ot, hanem már odaért volna, akkor azt mondtam volna, hogy echo $RANDOM

=====
tl;dr
Egy-két mondatban leírnátok, hogy lehet ellopni egy bitcoin-t?

Naív++.

Ubuntu 14.04 dash 0.5.7-4ubuntu1, illetve current master-ből (0.5.10.2 után) friss-ropogósan fordított dash:

./src/dash -c 'case 8 in [^0-9]) echo "nem szám" ;; *) echo szám ;; esac' 
nem szám

Ubuntu 16.04 dash 0.5.8-2.1ubuntu2, illetve current masterből

./configure --enable-fnmatch

után fordított dash:

/bin/dash -c 'case 8 in [^0-9]) echo "nem szám" ;; *) echo szám ;; esac'
szám

És a releváns POSIX bekezdés.

Akkor hat az a kerdes, van-e olyan shell, amiben ha megirsz valamit, hiba nelkul lefut mas shellek alatt.
Vagy meginkabb az a kerdes, hogy erdemes-e egyaltalan egy limitaltabb funkcionalitassal biro shellben scriptet irni, ha ugyis Linux es bash van mindenhol, vagy ha nem Linux akkor is van/lehet bash.
____________________
echo crash > /dev/kmem

Meh.

$ cat trap-output.sh 
#!/bin/sh

trap 'echo to-stdout; echo to-stderr >&2' EXIT

{ exit; } >OUT2 2>ERR2
$ dash ./trap-output.sh >OUT 2>ERR
$ cat OUT ERR
to-stdout
to-stderr
$ cat OUT2 ERR2
$ bash ./trap-output.sh >OUT 2>ERR
$ cat OUT ERR
$ cat OUT2 ERR2
to-stdout
to-stderr

ksh, ksh93 és Busybox sh úgy viselkedik, mint a dash; zsh, mksh/lksh, yash, NetBSD sh pedig úgy, mint Bash.

POSIX a Bash-nak és társainak ad igazat: "The environment in which the shell executes a trap on EXIT shall be identical to the environment immediately after the last command executed before the trap on EXIT was taken."
Hogy a különféle signal-okra regisztrál trap action-öknek milyen környezetben kellene futnia, az mintha nem lenne specifikálva...

sh -c 'while read s; do printf $(( ${#s} % 2 )); done</dev/urandom'

több mindent is megértettem ebből s a segítségetekkel, köszönöm! egyrészt azt, hogy a # a sztring hosszát adja vissza, másrészt megismertem ezt a % jelet az aritmetikai kifejezésben, ami, ha jól értem a paramétere által megadott maradékot adja vissza.

Gyorsnak nem gyors, persze ezzel is tudok kezdeni valamit, de jobban örülnék, ha 100.000 karaktert generálni egy másodperc alatt :))

Megírod c-ben a programot, ami random [1|0] -t ír standart outputra. Vagy az értéket /dev/urandom -ból kiolvasva, vagy a rand() függvényt használva. Az utóbbi gyorsabb.
Néha jól jön az ilyen shell-ben, de nem 100000-res mennyiségben.

-fs-
Az olyan tárgyakat, amik képesek az mc futtatására, munkaeszköznek nevezzük.
Amióta megismerkedtem az Anroidos és IOS-es kacatokkal, azóta a Windows láttán már nem kapok gyomorgörcsöt.

$ cat /dev/urandom |head -c 16|hexdump -e '"%03d "'
-1734809013 -502496132 1378839751 1745071248

Ilyesmi kell? Nem is értem mit akarsz ebből kihozni. Az urandomból pszeudórandom számok jönnek eleve bájtonként. Ahány bájtos számot akarsz, annyit olvasol ki. Miért kellene a számokat számmá alakítani, ha már egyszer eleve számok?