Portál AbcLinuxu, 30. dubna 2025 10:11
short cisel = 0.3; // 30% tohle at se vsechno nastavi nekde na vstupu short pismen = 0.7; // 70% int celkem = 100; int celkem_cisel = celkem*cisel; int celkem_pismen = celkem*pismen; for (i=0,i<=celkem ,i++){ srand((unsigned)time(0)); // aby cisla byla na pohled nahodna int rozhodovac = rand(); if (((rozhodovac%2)=0 && celkem_cisel>=0) || celkem_pismen=0){ // generovani 1 cisla se zapisem do souboru atd., nechce se mi nad tim premyslet --celkem_cisel; } if (((rozhodovac%2)!=0 && celkem_pismen>=0 || celkem_cisel=0){ // generovani 1 pismena se zapisem do souboru atd --celkem_pismen; } }
import random import re # vrati znak 0-9 def getNumber(): return chr(random.randrange(ord('0'), ord('9'))) # vrati A-Za-z def getChar(): ret = chr(91) while not re.match('[A-Za-z]', ret): ret = chr(random.randrange(ord('A'), ord('z'))) return ret # pomer pouze ciselnych ku neciselnym num_ratio = 0.3 # celkovy pocet cisel count = random.randrange(150, 250) # generovani while count: if (random.randint(0, 99) <= 100*num_ratio): print getNumber() else: print getChar() count -= 1Dokonalejší verze by si ještě pamatovala počty už vygenerovaných čísel/znaků, ale s tím se mi popravdě už psát nechtělo
(define (gen-items noitems fromc toc) (if (= noitems 0) '() (append (gen-items (- noitems 1) fromc toc) (list (integer->char (+ (random (+ (- (char->integer toc) (char->integer fromc)) 1)) (char->integer fromc))))))) (define (shake noshakes str) (if (= noshakes 0) str (let* ((pos1 (random (string-length str))) (pos2 (random (string-length str))) (ch1 (string-ref str pos1)) (ch2 (string-ref str pos2))) (string-set! str pos1 ch2) (string-set! str pos2 ch1) (shake (- noshakes 1) str)))) ;Tohle si definuje uzivatel (define nonums 0.2) (define nosc 0.3) (define nolc 0.5) ;A tohle uz se pocita (define noitems (+ 150 (random (+ 1 (- 250 150))))) (define str (list->string (append (gen-items (inexact->exact (round (* noitems nolc))) #\A #\Z) (gen-items (inexact->exact (round (* noitems nosc))) #\a #\z) (gen-items (inexact->exact (round (* noitems nonums))) #\0 #\9)))) (shake (* (string-length str) 2) str)
(use srfi-13) (use srfi-27) ;; Ze znaku retezce retezec generuje nahodny retezec delky delka ;) (define (nahodny-retezec retezec delka) (string-tabulate (lambda _ (string-ref retezec (random-integer (string-length retezec)))) delka)) ;; nahodne prohazi seznam (define (prohazej seznam) (map cdr (sort (map (cut cons (random-real) <>) seznam) (lambda (a b) (< (car a) (car b)))))) (define (generuj delka) (let* ((cislic (round (* 0.3 delka))) (retezec-k-prohazeni (string-concatenate (map nahodny-retezec '("abcdefghijklmnopqrstuvxwyzABCDEFGHIJKLMNOPQRSTUVXWYZ" "0123456789") ; mnoziny znaku (list (- delka cislic) cislic))))) ; prislusne pocty (list->string (prohazej (string->list retezec-k-prohazeni))))) (dotimes (i 10) (display (generuj 20)) (newline))
CHARS = (('a'..'z').to_a + ('A'..'Z').to_a) NUMS = (0..9).to_a def generate(l) c = (l*0.3).round t = [[CHARS, l-c], [NUMS, c]].map{|ch, n| Array.new(n){ch[rand(ch.size)]}} t.flatten.sort_by {rand}.join endPřijde mi rozumně kompaktní a dá se rozšířit na více skupin ekvivalence
if ((procent>0) and (procent<100)) then {generuje pismena i znaky} begin cisel:=Int((pocet/100)*procent); pismen:=(pocet-cisel); c:=0; p:=0; for i:=1 to ((pocet)) do begin pom:=random(2); if ((pom=0) and (c<>cisel)) then generuj_cisla; if ((pom=0) and (c=cisel)) then generuj_znaky; if ((pom=1) and (p<>pismen)) then generuj_znaky; if ((pom=1) and (p=pismen)) then generuj_cisla; end end;Generuj_cisla a generuj_znaky jsou procedury, které vypadají takto :
procedure generuj_cisla; begin znak := random(10)+48; {generuje cisla} c:=c+1; write(vystup,chr(znak)); end; procedure generuj_znaky; begin if (random(2))=0 then begin znak := random(26)+65; {generuje velka pismena} p:=p+1; write(vystup,chr(znak)) end else begin znak := random(26)+97; {generuje male pismena} p:=p+1; write(vystup,chr(znak)); end; end;Netušíte někdo jak to odladit aby mi neulítával ten jeden či dva znaky? Vyjma možnosti, že je na konci spočítám a přebývající smažu.
int main(int argc,char **argv) { // pocet znaku const int count = 1000; // pomer float rate = 0.256; int zero_rate = (int)(rate*(float)count); int sum = count; int z_cnt = 0; int o_cnt = 0; do { if (rand()%sum < zero_rate) { putchar('0'); z_cnt++; zero_rate--; } else { putchar('1'); o_cnt++; } } while(--sum > 0); register float f_count = (float)count; printf("\nfinal rate: %f : %f\n",(float)z_cnt/f_count,(float)o_cnt/f_count); return 0; }
cat /dev/urandom | tr -cd A-Za-z0-9 | fold -w8 | head -n 1
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.