Véletlen számok - Assembly
2006-03-16T20:24:46+01:00
2006-03-18T13:34:45+01:00
2022-07-19T05:44:24+02:00
  • hi!
    A sima mul edx a kovetkezot teszi:
    megszorozza eax-et edx-el
    64h*e5c95b15h=59C2A79434h
    a 64 bites eredmenyt eax:edx-ben tarolja ugy, hogy a felso 32 bit kerul az edx-be, ami 59H = 89 dec.

    szal van egy veletlen szamod, ami 0..n-1 ig vehet fel ertekeket (ez a randseed) en neked m-1 -ig van szukseged veletlenszamra, akkor 'atmappolod' valahogy igy:
    result:=randseed*m/n

    es mivel jelen esetben n az pont 2^32 ezert az osztashoz veszed a felso 32 bitet.
    Mutasd a teljes hozzászólást!
  • Köszi így már értem, szerintem a számológép duplaszó-ra volt állítva, ezért nem írta ki az 59-et.
    Mutasd a teljes hozzászólást!
  • A végén nézted el a kódot mert az eredmény nem egyszerűen C2A79434h lesz hanem 59C2A79434! Mivel ez már így nem fér el 32 biten az 59 már EDX-ben fog tárolódni ami decimálisan pontosan 89!
    Mutasd a teljes hozzászólást!
  • Sikerült megírni egy aránylag normális véletlenszám generáló progit.

    real_het: Ha te érted, hogy pontosan hogyan működik az a kód, amit beírtál, akkor légyszi írd le. Lejjebb én is megpróbáltam értelmezni, abban hol a hiba?
    Mutasd a teljes hozzászólást!
  • Nem néztem szét elég alaposan, most találtam egy jó oldalt és ez alapján ezt csináltam:
    %include "print.mac" segment code ..start: mov ax, data mov ds, ax mov es, ax mov ax, stack mov ss, ax mov sp, stacktop mov eax, 01h cpuid and edx, 10h cmp edx, 00h je exit rdtsc printDecNumber 00h exit: mov ax, 4c00h int 21h segment data segment stack stack resb 64 stacktop:

    [Szerkesztve]
    Bocsi, ha egy kicsit off volt.
    Mutasd a teljes hozzászólást!
  • Az RDTSC utasítás (az opkódja 0Fh 31h) az EDX:EAX regiszterpárosba teszi a TSC regiszter értékét! Ezt a 64bites értéket aztán felhasználhatod a véletlen szám előállításához úgy mint az időt!
    Mutasd a teljes hozzászólást!
  • Néztem a neten infót a TSC-ről, de nem igazán értem, hogy hogyan kell használni ezeket.
    Mutasd a teljes hozzászólást!
  • Megnéztem azt, amit írtál. Nekem is nagyon jól működik, viszont nem nagyon értem, hogy ez hogyan működik. Levezetem, hogy hogyan gondolkodtam, mert szerintem abban van valahol a hiba.
    Példa:
    eax, edx = 0
    [randseed] = 352f 0f04h

    mov eax, 64h ;0-100-ig imul edx, [randseed], 08088405h ; edx = 352f 0f04h * 0808 8405h = e5c9 5b14h inc edx ; edx = e5c9 5b15h mov [randseed], edx ;[randseed] = e5c9 5b15h mul edx ; edx:eax = c2a7 9434h ; vagyis edx = 0000 0000h és eax = c2a7 9434h ; ha ezek után kiírom edx-t, akkor szerintem 0-t kellene kapnom ; kiírattam, és : 89-et kaptam (decimálisan)

    Szerintetek mi a hiba?
    Mutasd a teljes hozzászólást!
  • Üdv! Vond be a játékba a processzor TSC regiszterét is! Ez egy 64 bites regiszter amelynek az értéke minden órajelciklus hatására 1-el növekszik! Az RDTSC utasítással tudod lekérdezni! A CPUID-vel ellenőrizheted hogy az adott CPU-n jelen van-e a regiszter!
    Mutasd a teljes hozzászólást!
  • Megneztem hogy a randomteszter mit mond rá:

    Entropy = 7.995097 bits per byte.

    Optimum compression would reduce the size
    of this 32768 byte file by 0 percent.

    nem gondoltam volna, hogy ennyire jo :DDD
    Mutasd a teljes hozzászólást!
  • Hi!

    Nemtom, segit-e, de engem is erdekelt, es csak megneztem, hogy a delphi hogyan generalja az alveletlen szamait:

    bemenet: eax - felsô_határ imul edx,[randseed],$08088405 inc edx mov [randseed],edx mul edx kimenet: edx - 0<=edx<felsô_határ

    Lenyegeben ugy mukodik, hogy egy belsô randseed nevu int32-t minden generalaskor megszoroz egy konstatsal, noveli egyel, es az also 32 bitet irja vissza bele.
    Ez a randseed a konstansnak koszonhetoen 0..4milliard intervallumban nagyon osszevissza ugral. A plusz egy azert van benne, hogy a 0-nal ne ragadjon be.

    Vegul ezt a 0..4milliard kozott ingadozo erteket boszorozza a felso hatarral, 'osztja' 4milliardal es ezt az erteket adja vissza.

    (a 4milliardot a 2^32-1 helyett irtam)

    Indulaskor a randseedet meg ahogy Mate12345 is irta a rendszeridobol kell feltolteni.
    Mutasd a teljes hozzászólást!
  • Az előző véletlenszám és az idő függvényében generálj vmit. Talán úgy jobb lesz. De akkot kell neki egy kezdőérték mondjuk a rendszerórából.
    Mutasd a teljes hozzászólást!
  • Mutasd a teljes hozzászólást!
  • Hello,

    Van pár algoritmus, amivel lehet véletlen számokat generálni. Én írtam egyet, de nem tudom, hogy mennyire generál véletlen számokat. Lekérdezi az időt, a másodperceket és a perceket összeszorozza, majd elosztja a perceket 16-tal, és ezzel megszorozza az előbbi szorzatot. Így még pont elfér 2 byte-on. Majd ezt a számot elosztja 100-zal így kapok egy számot 0-100 között. Az a gondom, hogy csináltam egy olyan programot, ami kiírja a véletlen számokat, ha különböző, mint az előző. Ez másodpercenként írt ki új számot, vagyis egy másodperc kell ahhoz, hogy új szám generálódjon, a következő gondom az volt, hogy egy idő után elkezdett kiszámíthatóvá vállni. 0-tól ment 95-ig 5-ösével vagy volt amikor 2-esével váltott, de végigment. De az első pár szám tényleg véletlen volt. Nem tudjátok, hogy mért lehetett ez? Van valamilyen gyorsabb algoritmus, amivel nem kell 1 másodpercet várni? Ha igen, akkor hogyan működik?(int10/ah=2ch dl-ben nekem mindig 0-t ad vissza, szóval a századmásodperceket nem tudom elérni)
    Mutasd a teljes hozzászólást!
Címkék
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd