Hallo, ich stehe vor einem kleinen Problem und würde gerne euere Meinung hören, ob diese Lösung funktionieren kann ..... Ich benötige Zufallszahlen um auf einem RGB-LED-Panel [96x32] zufällig LEDs in zufälligen Farben aufleuchten zu lassen. Dazu habe ich die Random-Funktion meines Compilers bemüht (welcher ist ja mal egal) und festgestellt, daß immer die gleichen LEDs leuchten. Manchmal kommt ein anderes Muster, aber im großen und ganzen gibt es nur 2 unterschiedliche. Die Idee wäre nun einen Rauschgenerator an einen der ADCs anzuschliessen und diesen zyklisch auszulesen. Da es ein XMega ist, hätte ich 12 Bit also einen Bereich von 0-4095 zur Verfügung. Das beschränken auf meine benötigten Werte bekomme ich hin. Kann das funktionieren? Als Rauschgenerator würde ich einen TA7642 AM-Empfänger-IC nehmen, von dem liegen noch 20 Stück rum und auf MW rauscht es eh nur noch.
Seed mit srand initialisiert? https://stackoverflow.com/questions/822323/how-to-generate-a-random-int-in-c
Hallo, Crazy Harry schrieb: > Danke aber kein C, sondern Pascal ;-) In Borland Pascal und Lazarus (free pascal) gibt es dafür die Funktion Random(). rhf
Mikro 7. schrieb: > Seed mit srand initialisiert? Crazy Harry schrieb: > Danke aber kein C, sondern Pascal ;-) Dort heißt das glaube ich "Randomize;" iirc. Code? Crazy Harry schrieb: > Die Idee wäre nun einen Rauschgenerator an einen der ADCs [...] > Kann das funktionieren? "Im-Prinzip-Ja", aber das hängt entscheidend von der Qualität des Rauschgenerators ab (u.a. Autokorellationsspektrum) und von der Art und Weise, wie die Ränder des Amplitudenspektrums behandelt werden. Die direkt vom ADC erzeugten Werte werden dann vermutlich normalverteilt sein und nicht gleichverteilt, das muss dann im Zweifel umgemappt oder sonstwie behandelt werden. Die Abtastintervalle müssen deutlich länger als die inverse Bandbreite der Rauschquelle sein. Für ernsthafte Kryptographie muss da eine Menge Gehirnschmalz rein, aber wenn Du bloss Lichteffekte brauchst sollte das tun. mc2¢ (re)
Hast du „randomize;“ aufgerufen? Wenn ja; wann, wo und wie oft? Einfach „random(255;“ (oderso) erzeugt halt immer die gleichen, sich wiederholenden Zahlen. Wie genau Random(x) nun in Pascal implantiert ist, weiß ich ehrlich gesagt auch nicht. Aber ich weiß noch, dass man og. „Randomize“ aufrufen muss, um das ganze so ‚in Gang‘ zu setzen, dass random mit neuen Startwerten gefüttert wird, um es mal so auszudrücken. Edit: implementiert
:
Bearbeitet durch User
Wenn es ein user-input gitb (taster, touch etc) eignet dieser (dessen zufälliger zeitpunkt und zeitdauer) sich auch gut als quelle.
Crazy Harry schrieb: > Als Rauschgenerator würde ich einen TA7642 > AM-Empfänger-IC nehmen Damit würdest Du Dich davon abhängig machen, wieviele Schaltnetzteile in der Umgebung laufen. Geht viel einfacher: Gebräuchlich sind z.B. Zenerdioden oder invers betriebene Emitter-Basis-Strecken von BJTs, die dann breitbandig verstärkt werden. (re)
:
Bearbeitet durch User
Alternativ zu „Randomize;“, welcher den Random-Generator mit systemticks seit Start (sowas wie millis()) initialisiert, könntest du den Rückgabewert „Randseed“ auch selbst mit einer (Long)Zahl füttern. Hier kann man tatsächlich den ADC nehmen, wenn man die Sache beliebig kompliziert werden lassen will. Ich würde halt ab und an „randomize“ aufrufen. Pascal ist bei mir auch schon wieder 20Jahre her. Hab mal viel mit Delphi programmiert.
:
Bearbeitet durch User
Crazy Harry schrieb: > ... und festgestellt, daß immer die gleichen LEDs leuchten. Dann verwendest du immer den gleichen Startwert. > Als Rauschgenerator würde ich einen TA7642 AM-Empfänger-IC nehmen Für ein paar blinkende LEDs ist das viel zu viel Aufwand. Hast du nicht irgendeine Tastendruckdauer oder eine Uhrzeit, um dem Zufallszahlengenerator die identischen Startbedingungen abzugewöhnen?
Bradward B. schrieb: > Crazy Harry schrieb: >> Danke aber kein C, sondern Pascal ;-) > > randomize() randomize; 😎
Woher soll "randomize" auf einem Mikrocontroller die Entropie nehmen? Am einfachsten speichert man den "random seed" vorm Ausschalten.
Ohne auf Compiler oder Library Vodoo zu vertrauen .. Das Konzept nennt sich LFSR, linear feedback shift register. Durch Nachbilden eines schieberegisters und feedback kann man Zufallszahlen vor vorgegebener Periodizitaet bekommen. Mit 20 bit ist die Periode 1 Million, bei 30 bit eine Milliarde. Die Tabelle geht bis 168 oder so... Siehe Xilinx, XAPP 210 : https://docs.amd.com/v/u/en-US/xapp210
:
Bearbeitet durch User
Purzel H. schrieb: > Ohne auf Compiler oder Library Vodoo zu vertrauen .. Das Konzept nennt > sich LFSR, linear feedback shift register. ... das ist der Kern der "Voodoo" in den Libraries ja meistens. Nennt sich dann Pseudo-Random-Binary-Sequence. ("PRBS") Das Problem des OT war aber ... Crazy Harry schrieb: > und festgestellt, daß immer die gleichen LEDs leuchten. ... dass dieses "linear feedback shift regitser" immer die gleichen Sequenzen liefert, wenn es immer mit dem gleichen Wert gestartet wird. Dieser Initialwert ist der "Seed", für den eine "Entropy-Source" benötigt wird - z.B.: die Länge des Tastaturdrucks in Pikosekunden :-) Um den geht es hier. (re)
Vielleicht meldet sich Harry ja nochmal und löst auf. Evtl. ist random einfach so aufgerufen worden, liefert ein real von 0.0 - 1.0 und er castet versehentlich auf int. dann kommt immer Null oder Eins raus. Kann ja auch sein. Daher warte ich erstmal auf Feedback.
Mario M. schrieb: > Woher soll "randomize" auf einem Mikrocontroller die Entropie nehmen? Zum Beispiel von der Dauer, wie lange ein Start-Taster gedrückt wurde.
Danke aber das ist kein Turbo oder Lazarus. Wenn ich den Startwert ändere, kommt zwar auch ein anderes Muster, aber auch das ist bei gleichem Startwert immer gleich. Das (Bild) gibt der Compiler her (AVRCo).
Crazy Harry schrieb: > Danke aber das ist kein Turbo oder Lazarus. Wenn ich den Startwert > ändere, kommt zwar auch ein anderes Muster, aber auch das ist bei > gleichem Startwert immer gleich. So arbeiten die PRNG nun einmal. An denen ist reinweg garnichts zufällig, sondern streng deterministisch. Gleicher Seed, gleiche Sequenz. Egal ob in C, Pascal oder INTERCAL.
:
Bearbeitet durch User
Crazy Harry schrieb: > Wenn ich den Startwert ändere, kommt zwar auch ein anderes Muster, aber > auch das ist bei gleichem Startwert immer gleich. Das haben alle Pseudo-RNG gemeinsam und ist dort beabsichtigt.
Gut dann lassen wir doch mal die Random-Funktion des Compilers. Daß die Sche...e ist, weiss ich ja, deshalb der Ansatz Rauschen und ADC, nur wird das funktionieren? Ich würde den ADC-Eingang aus dem Bauch raus ja komplett ohne Kondensator beschalten, denn der würde das Rauschen ja glätten.
Crazy Harry schrieb: > deshalb der Ansatz Rauschen und ADC, nur wird das funktionieren? Du könntest auch den ersten ADC-Wert nur als Startwert der Random-Funktion verwenden. Dann tut es statt Rauschen vielleicht sogar 50Hz Netzfrequenz.
:
Bearbeitet durch User
Crazy Harry schrieb: > deshalb der Ansatz Rauschen und ADC, nur > wird das funktionieren? Ausprobieren: Von ausreichend ADC-Samples nur das unterste Bit verwenden und entweder direkt nutzen, oder damit einen PRNG füttern. Kryptographische Qualität benötigst du ja nicht.
:
Bearbeitet durch User
Nimm halt den https://www.mouser.de/ProductDetail/Microchip-Technology/RNG90-SSVDA-T?qs=9vOqFld9vZVk6wBjQG9AIA%3D%3D
Crazy Harry schrieb: > Daß die Sche...e ist, weiss ich ja, ... Sche...e ist, dass du nicht verstehst, wie die gestartet werden muss, um deine Anforderungen zu erfüllen. Wenn du immer an der selben Stelle in der PRBS startest (festes Seed), kannst du nicht erwarten, dass sich etwas ändert. Damit das System nicht merkt, dass die PRBS periodisch ist, muss das Systemgedächnis kürzer als diese Periode sein und der Generator nicht immer mit dem selben Startwert gestartet werden.
Verglichen mit der Aussage „ohne Kondensator“ am ADC und der (halbwegs vorherrschenden) Komplexität der, auf Hackaday, vorgestellten Schaltung glaube ich nicht, dass das für Harry so einfach umzusetzen sein wird. Harry, wenn kannst/willst/darfst so stell doch mal deinen Code ein, lade ihn hier als Anhang hoch. Dann kann „man“ sich das ansehen. Soo grottenschlecht ist der Random-Algo nicht, wenn man ihn, wie von der Implementation vorgesehen, verwendet. Kannst aber auch nen 4K7 gegen VCC (5V/3.3V?) (da fallen bei geschätzten 300uA ca 1.4V ab) und eine elektretkapsel gegen GND schalten. OHNE Kondensator am Mittelabgeiff auf den ADC… da liegst du ungefähr auf V-halbe und wirst einen startwert von um 500 rum haben, wenn du das Rauschen der Kapsel und den „Krach“, den sie einfängt, nicht noch anderweitig verstärken willst.
Zähle doch einfach beim Reset eine Variable im EEPROM hoch und verwende deren Wert als "random seed". Alternativ könntest Du einen Bereich im RAM als $NOINIT definieren, in der Hoffung dass der Inhalt zufällig ist und eine Prüfsumme über den Bereich als Startwert für den Zufallsgenerator nutzen.
Axel R. schrieb: > wenn kannst/willst/darfst so stell doch mal deinen Code ein Kann ich, wenn ich am entsprechenden PC war. Kann aber 1-2 Tage dauern. Ich habe auch schon den Startwert als Random gesetzt, also RandomSeed(Random) aber selbst das bringt immer das gleiche Muster.
Crazy Harry schrieb: > Ich habe auch schon den Startwert als Random gesetzt, also > RandomSeed(Random) aber selbst das bringt immer das gleiche Muster. Wenig überraschend. Du hattest ja schon festgestellt, das ohne Seed die gleiche Sequenz kommt. Da ändert es auch nichts, wenn du den PRNG mit sich selbst fütterst.
Crazy Harry schrieb: > Ansatz Rauschen und ADC, nur wird das funktionieren? 'türlich wird es. Du musst nur darauf achten: a) Die Abstastgeschwindigkeit muss deutlich langsamer sein als die inverse Bandbreite des Rauschens b) Die Zahlenwerte werden nicht gleichverteilt sein, sondern Gauss-verteilt ("Glockenkurve"). Die müsste man ggf. noch per Software gradebiegen, wenn erforderlich. Wenn a/b das ein Problem ist, dann nimm nur einige wenige ADC-Zufallszahlen und füttere damit den Startwert eines PRNG. > Ich würde den ADC-Eingang aus dem Bauch raus ja > komplett ohne Kondensator beschalten, denn der würde das Rauschen ja > glätten. Ja, der C wäre kontraproduktiv. Als Rauschquelle nimm einfach eine Zenerdiode, deren Rauschen breitbandig verstärkt wird. | https://www.qsl.net/dk3wi/HF_Noise_Generator.html HTH (re)
:
Bearbeitet durch User
Re schrieb: > Als Rauschquelle nimm einfach eine Zenerdiode, deren Rauschen > breitbandig verstärkt wird. Antenne, in Form ein paar cm offener Leitung, dürfte fürs unterste Bit des ADC reichen. Da ist zwar jeder Mist dabei, voran SNTs und Leuchtstoffröhren, aber für den Seed eines PRNG und seine LEDs reicht es sicher.
:
Bearbeitet durch User
(prx) A. K. schrieb: > Antenne, in Form ein paar cm offener Leitung, dürfte fürs unterste Bit > des ADC reichen. Da ist zwar jeder Mist dabei, voran SNTs und > Leuchtstoffröhren, aber für den Seed eines PRNG und seine LEDs reicht es > sicher DAS ist mal eine Idee, die schnell umsetzbar ist :-) Danke.
Hi, in Beitrag "Random" hatte ich mal nen Zufallszahlengenerator vorgestellt. Der macht guten Zufall. LFSR als Zufallszahlengeneratoren ranziehen ist keine gute Idee. Selbst wenn man nur ein Einzelbit nimmt ist das nicht gut verteilt. Analoge Quellen Antennen Z-Dioden etc. pp. nicht ranziehen. Wir haben mal Wochen erfolglos zugebracht um eine Schaltung mit Z-Diode von einem Radio in einen Rauschgenerator zu verwandeln. Mache nie was analog was Du auch digital machen könntest. Cheers Detlef
:
Bearbeitet durch User
Detlef _. schrieb: > > in Beitrag "Random" > > hatte ich mal nen Zufallszahlengenerator vorgestellt. Der macht guten > Zufall. Ein Quellenangabe würde nicht schaden. Der Code stammt aus "Numerical Recipes in C: The Art of Scientific Computing" und ist der “Minimal" Random Generator von Park und Miller. In dem Buch gibt es übrigens noch mehr davon.
Dieter S. schrieb: > Detlef _. schrieb: >> >> in Beitrag "Random" >> >> hatte ich mal nen Zufallszahlengenerator vorgestellt. Der macht guten >> Zufall. > > Ein Quellenangabe würde nicht schaden. Der Code stammt aus "Numerical > Recipes in C: The Art of Scientific Computing" und ist der “Minimal" > Random Generator von Park und Miller. In dem Buch gibt es übrigens noch > mehr davon. Stimmt, danke für den Hinweis. Der post von mir ist von 2006 oder so, ich hatte vergessen woher ich den hatte, damals hatte ich die Quelle aber auch nicht genannt. Ich will mich auf keinen Fall mit fremden Federn schmücken. Ich benötige aber auch keinen akakdemischen oder sonst irgendeinen Schmuck mehr. Cheers Detlef
Mario M. schrieb: > Zähle doch einfach beim Reset eine Variable im EEPROM hoch und verwende > deren Wert als "random seed". Die beste Antwort wird wieder mal ignoriert. Das ist die Lösung für das Problem von Harry. Er will nicht, dass jedesmal die gleiche Abfolge erscheint. Wenn die Pseudozufallszahlengeneratoren (PRNG), die hinter den üblichen Funktionen random, randomize, etc. der Programmiersprachen liegen, mit unterschiedlichen Startwerten gefüttert werden, erzeugen sie komplett unterschiedliche Folgen. (Das ist ihr eigentlicher Job für z.B. Kryptographie). Wenn ich also einen einfachen Zähler im EEPROM jedes mal erhöhe und ihn als Startwert nehme, dann kommt jedesmal eine komplett andere Folge raus, Auch wenn diese Startwerte dann 0,1,2,3,4,5,... sind. Und das ist ja, was Harry will oder? Da benötigen wir doch keinen ADC der irgendeinen Mikrofonoutput misst.
:
Bearbeitet durch User
Bernd S. schrieb: > Und das ist > ja, was Harry will oder? Nicht ganz, denn da das ein Lichteffekt ist/sein soll, müßte ich bei jedem Durchlauf einen neuen Wert übergeben. Wie lange wird das bei einem Word 0..65535 wohl reichen, wenn die Schaltung auch mal 4...5h am Stück läuft und für jeden Displayaufbau 5s benötigt? Von der Lebensdauer des EEPROMs mal ganz zu schweigen. Aber das bringt mich auf eine andere Idee: Startwert 1, Bild, Startwert 2, Bild, ... usw. Probier ich mal aus :-)
Nein. Bei jedem Start des Controllers hochzählen und den Wert als Seed in einen PRNG einspeisen.
:
Bearbeitet durch User
Der Mikrocontroller von Arduino UNO R4 soll Zufallszahlen generieren können. Renesas Datasheet RA4M1 Group: • AES128/256 • GHASH • True Random Number Generator (TRNG)
falls kein TRNG auf dem µC vorhanden ist oder die implementierung nicht vorhanden/man zu faul ist: 1. wähle einen initialen seed der größe x bytes (bspw. bei AES-128 wären es 16 byte, bei SHA256 wären 8 bis 32 byte in ordnung) 2. berechne einen cipher/hash des seeds (da reicht ein AES-128 oder jegliche art von hash-funktion) -> output ist eine random number mit x bytes (bspw. bei AES-128 sinds 16 byte, bei SHA256 dann 32 byte) 3. setze einen neuen seed aus dem initialen seed (aus 1.) und der zuletzt generierten random number (aus 2.) zusammen (bspw. die ersten 8 bytes aus initial seed + die ersten 8 bytes aus der random number) 4. wiederhole die schritte 2. und 3. nach bedarf damit kann man sogar die üblichen random number test-suites bestehen ...
:
Bearbeitet durch User
Crazy Harry schrieb: > Nicht ganz, denn da das ein Lichteffekt ist/sein soll, müßte ich bei > jedem Durchlauf einen neuen Wert übergeben. Wie lange wird das bei einem > Word 0..65535 wohl reichen, wenn die Schaltung auch mal 4...5h am Stück wenn ich dich richtig verstanden habe, geht das: ist der Generator erst mal gestartet, liefert er bei jedem Zugriff eine "andere" Zufallszahl. Das kannst Du je nach Länge der Periode des Generators sehr sehr oft machen, bis sich die Zahlen wiederholen. Also beim Programmstart den Generator einmal initialisieren, und dann einfach immer neue Zahlen anfordern. Der Generator kann dann durchlaufen bis das Gerät ausgeschaltet wird. Du könntest auch den vorgeschlagenen Zähler nehmen und während des Programmlaufs an den gewünschten Stellen mit (Zähler * n) den Generator wieder neu initialisieren. Oder Du initialisierst den Generator an den gewünschten Stellen mit dem letzten generierten Zufallswert. Das ist dann zwar bezogen auf den Startwert auch wieder deterministisch, aber du bekommst "für jedes Spiel" andere Zahlen, auch wenn Du das Gerät nicht ausschaltest. Kommt halt sehr darauf an, was Du machen willst. ciao Marci
Marci W. schrieb: > Oder Du initialisierst den Generator an den gewünschten Stellen mit dem > letzten generierten Zufallswert. Ob man beim Start des Controllers einen inkrementierten Zähler im EEPROM als Seed verwendet, oder den Seed im EEPROM durch die erste daraus abgeleitete Zufallszahl ersetzt, ist bei nicht zu bescheuertem PRNG das gleiche Prinzip. Sowohl was das Erlebnis angeht, als auch in der Anzahl Schreibzyklen. Auch die jeweils letzte als Seed zu verwenden ändert daran wenig, geht aber auf die Schreibzyklen. Kryptografische Sicherheit würde ich daraus nicht ableiten, aber für die LEDs braucht man die nicht. Es reicht ja, wenn es sich nicht offensichtlich von Anfang an wiederholt.
:
Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.