![]() |
Random Generator mit In-Output
Hallo,
ja, der Titel ist verwirrend, aber umschreibt ganz gut was ich versuche zu bekommen. STORY: Ich schreibe im Rahmen eine Schulprojektes ein kleines Programm was aus einem Bild bzw. dessen Farben/Pixeln Töne mittels MIDI erzeugt. Das funktioniert bisher auch ganz gut. Nun hab ich das Problem, dass ich ja nicht immer den gleichen Ton hören will, also brauch ich eine Art Zufallsgenerator. Nun zum Problem: Ich kann (wahrscheinlich) NICHT den Delphi internen Generator nehmen. Wenn ich ein Bild lade, das abspiele und mich von der grandiosen Musik beschallen lassen hab, ist alles prima, wenn ich das Bild nun erneut lade, sollte ja auch das gleiche "Lied" entstehen, entsprechend muss ich einen Zufallsgenerator nutzen, dem ich einen Input geben kann, der darauf hin immer den gleichen Output gibt. Eine Zufallszahl mit gegebenen Werten zu erzeugen hab ich bisher semi-professionell mit einem XorShift gelöst, nicht schön aber es tut was es soll. Jetzt brauch ich aber möglichst einen Weg die entstandene Zahl (derzeit ein Cardinal) in einen von mir definierten Bereich zu pressen, ähnlich wie random(10) nur noch Zahlen zwischen 0 und 9 ausgibt. Also für alle lesefaulen (und alle, die meine eher komische Art Fragen zu stellen nicht entziffern können): Wie bekomme ich einen Zufallsgenerator der mir bei gleichen Input immer den gleichen Output serviert? und/oder Wie bekomme ich große Zahlen vernünftig in einen definierten Zahlenbereich komprimiert? (also z.B.: 184 492 344 in einen Bereich zwischen 0 und 87) Alternativ könnt ihr mir auch nen Googleansatz geben, ich hab nähmlich einfach keine Ideen mehr... Danke im Vorraus |
AW: Random Generator mit In-Output
Zitat:
Code:
Wenn Du einen Bereich von 0..87 benötigst, warum generierst Du dir nicht die Zufallszahlen in diesem Bereich?
184492244 mod 87
Grüße Klaus |
AW: Random Generator mit In-Output
![]() Die Funktion Random von Delphi liefert immer die gleichen Werte, sofern nicht Randomize aufgerufen wird. D. H.: Man bekommt als "Zufall" immer die gleiche Zahlenreihenfolge. |
AW: Random Generator mit In-Output
Zitat:
PS: mod 88 und ratet mal, was ![]() |
AW: Random Generator mit In-Output
Heißt das, dass man in "aktuellen" Delphis mit Bordmitteln nicht mehr an eine reproduzierbare Reihenfolge von Zufallszahlen kommen kann?
|
AW: Random Generator mit In-Output
Wenn du "früher" den Start nicht selbst initialisiert hast,
dann war dein Code sowieso nie reproduzierbar. ![]() |
AW: Random Generator mit In-Output
@tumo: Warum führst du nicht eine Liste, in der du vermerkst, für welche Farbe du welche Zufallszahl erzeugt hast und lädst die beim Programmstart? Wenn du die Zahl brauchst, schau zuerst in der Liste nach, wenn du sie findest, gut, wenn nicht erzeuge sie+speichere sie in der Liste.
Da würde sich eine TStringList anbieten mit Farbe=Zahl-Paaren. Wäre das eine Idee? |
AW: Random Generator mit In-Output
Ich schliesse mich der Tigerin da an, da für mich die Aussage "Zufall" nicht in Einklang mit "festen Wert" funktioniert.
Oder Du schreibst Deine Ton-Routine um, das die einen vollen (RGB) Farbwert akzeptiert und da eventuell mit Random() noch etwas Variation reinbringen, kannst ja jeder Grundfarbe mit Random() nachhelfen. |
AW: Random Generator mit In-Output
@Klaus01 Ja, ääh, hätte man auch selber drauf kommen können... Danke :D Zur zweiten Frage: Wie? das ist ja das Problem. Wie generiere ich einen Zufallswert in einem festgelegten Bereich. Jetzt kann ich mich ja einfach mit
Delphi-Quellcode:
und
xor
Delphi-Quellcode:
austoben und am Ende
shl/shr
Delphi-Quellcode:
nutzen, das kommt denke ich mal nah genug ran.
mod ARange + 1
@himitsu Ich nehme mal an das PS ging an mich. Ja, das macht etwas in die Richtung, allerdings versteh ich nicht wie/warum das funktioniert und was da passiert, sowas stört mich eigentlich immer. Schließlich sollte wenigstens der Programmierer wissen, was das Programm wie macht. @TigerLilly @KodeZwerg Das ist genau das was ich nicht möchte, aufgrund von Gründen. Wenn jetzt zum Beispiel ein sehr langer Bereich mir nur weißen Pixeln kommt, soll mich ja nicht 30 (oder mehr) mal der gleiche Ton nerven. Ist auch mein Fehler, hab das in der Fragenstellung komplett vergessen zu erwähnen. Also möchte ich quasi einen Startwert (z.B.: aus der Durchschnittsfarbe oder dem Hash-Wert (wieder ein eigenes Thema was ich nicht verstehe)) für ein Bild berechnen und auf Basis davon immer das Ergebnis des Zufallsalgoritmus wieder in den "Zufall" einfließen lassen, sodass zwei aufeinanderfolgende Farben nicht identisch klingen (bzw. es wäre ein großer Zufall wenn :stupid:). |
AW: Random Generator mit In-Output
Zitat:
Beispiel für weiß = R=255 G=255 B=255, wenn du nun zu jedem R G B wert ein + oder - Random zufügst = Variation. Ist es nicht das was du wolltest? ps: das ergebiss der 3 werte kannst du natürlich noch mit dem "mod" runterrechnen. pps: selbst das + oder - kannst du per random(1) bestimmen lassen, mehr variation kann ich mir gerade nicht vorstellen. |
AW: Random Generator mit In-Output
@tumo: Du hast zwei Anforderungen:
1: Jeder Pixel eines Bildes soll seine eigene Frequenz (=Zufallszahl) bekommen. Auch wenn x weiße Pixel hintereinander stehen, sind das doch x unterschiedliche Frequenzen. 2: Bei jedem neuen Aufruf des Bildes sollen wieder dieselben Frequenzen benutzt werden. Dann erzeuge dir doch eine beliebig lange Tabelle von Zufallszahlen, benutze sie für die Frequenzen + speichere sie mit dem Bild gemeinsam ab. Neues Bild, neue Tabelle erzeugen. Schon mal aufgerufenes Bild, bestehende Tabelle benutzen. |
AW: Random Generator mit In-Output
Statt Randomize aufzurufen einfach den Startwert des Zufallszahlengenerators(RandSeed) selbst setzen.
Zum Beispiel mit der CRC-Summe der Bilddaten. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:01 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz