Zahlenbereiche abbilden auf andere Zahlenbereiche
-
.filmor schrieb:
Schonmal was von den vier magischen Werkzeugen (Multiplikation, Division, Addition, Substraktion) gehört?
iceborg01 schrieb:
Die rand / srand Funktion macht das ja indirekt auch, nur dass man der
nur einen Bereich übergeben kann [...]Ok, nehmen wir 'mal an es wäre so...
Dann könntest du dir doch eine Zufallszahl im Bereich ( max - min ) erzeugen lassen und zu min addieren, oder!?Du musst denken beim Programmieren.
Greetz, Swordfish
-
Danke für die Info, aber das ist nicht das was ich möchte.
@ Swordfish: Eben nicht. Den Zufallsgenerator schreibe ich selber.
Dessen Ergebnis soll abgebildet werden.@ Alle:
Bleiben wir mal bei meinem BSP 1.
Deine Funktion Z = (Q + 1) * (6.0 / 10.0) + 0.5 (oder auch die von Michael)
liefern für z. B. q = 2 eine z von 3.Aber der Quellbereich
(der Einfachheit halber setzen wir ihn mal statt 0 bis auf 1 bis 9)
soll linear abgebildet werden bis Quell(max) = Ziel(max) und danach
wieder von vorned. h:
Quelle => Ziel
1 => 1
2 => 2
3 => 3
4 => 4
5 => 5
6 => 6
7 => 1
8 => 2
9 => 3(Für die Abbildung des Quellbereiches 7 - 9 müsste man sich vielleicht
noch was anderes ausdenken)
-
Dann benutz halt den Modulo-Operator.
Wenn die Eingangsmenge größer als die Ausgangsmenge ist, ist die Operation nicht eindeutig.
-
Mit deinem Vorgehen machst du den Zufallsgenerator kaputt!!!
Was du suchst ist der Rest der Division, in C++ der Modulo-Operator (%):Z = Q % 7;
Übrigens entspricht das nicht deinen Angaben, selbst unter den "neuen Voraussetzungen".
Aber wie gesagt, damit ist dein Zufallsgenerator nicht mehr zu gebrauchen, denk mal über die Verteilung der Zufallszahlen nach diesem Prinzip nach...
-
Danke.
Habs mal durchgespielt.
Ja mit Z mod Q geht es.
Natürlich ist die Wirkung des Zuff-Gen verändert,
da eben die generierte Zahl nicht unbedingt der endgültigen
entspricht, aber das nehme ich in Kauf, da der Zuff-Gen
funktioniert bis einschl. Q = Z(max) wegen der
linearen Zuordnung und danach (Q = Z(max)+1) eben nicht mehr.Ich sehe auch keine andere Lösung,
da z. B. mein Zuff-Gen als z. B. Einstellige Zahl, die immer
0 - 9 ist, liefert und einer der nötigen Zielbereiche 1 - 6 ist.Gut man könnte ihn wiederholen bis er 1 - 6 ausspuckt, aber
das will ich nicht.
-
Generier doch einfach den größtmöglichen Bereich (den Wertebereich deines Ausgabetyps). Damit fallen die Unterschiede nicht mehr ins Gewicht.
Mit deiner Zuordnung kann nicht mehr von Zufall gesprochen werden, da die Wahrscheinlichkeit für 1-3 doppelt so hoch ist wie die für 4-6. Die Wirkung ist nicht nur verändert, sie ist hinüber.
-
Das wäre theor. möglich, aber:
Mein Ausgabetyp ist int.
Wenn ich nun einen Wert bis int(max) generiere würde das
wahrscheinlich die sinnvolle Funktionalität meines
Zufallsgenerators übersteigen, da dieser "echte" Zufallswerte
nur im 1 bis 3 -stelligen Bereich liefert, also allerhöchtens bis 999.
Darauf ist er ausgelegt.Möglichkeit:
Na denn muss ich eben Q = zweistellig wählen (evtl. begrenzen)
und dann umverteilen oder so.Aber wie gesagt, dass der Generator kaputt ist durch die Abbildung
sehe ich nicht so. außerdem könnte man ja q noch beeinflussen
im vorwege
wenn q > z dann q z. B. +1 oder so.
Möglicherweise spielt das Übergewicht bei Z von 1 bis 3 sogar in die Hände.Außerdem ist ja nicht nur Z 1-6 gefragt.
Wie auch immer, wenn es andere Lösungen gibt, immer her damit.
wichtig ist nur, dass mein Zuff-Gen erhalten bleibt.
-
Jetzt muss mir nur noch jemand erklären, warum die zuerst vorgeschlagenen Algorithmen nicht funktionieren und man das alles so kompliziert machen muss
-
iceborg01 schrieb:
[...] da dieser [Zufallsgenerator] "echte" Zufallswerte
nur im 1 bis 3 -stelligen Bereich liefert, also allerhöchtens bis 999.Darf den von dir Implementierten Zufallsgenerator aus bloßer Neugier 'mal sehen?
Greetz, Swordfish
-
@ Michael: weil ich vorhin schon schrieb, dass die anderen Algos nicht
linear sind und für z. B. q = 2 z = 3 liefern u. ä.@ Swordfish: Ich kann und will meinen Zuff-Gen noch nicht herausgeben.
(Später gerne)
Er ist nocht nicht implementiert, sondern existiert bisher
nur auf dem Papier.
Was viel wichtiger als später das implementieren ist:
Er ist in umfangreichen Kalk-Tabellen
durchgespielt worden, um zu sehen, ob er Sinn macht.Ich sag mal soviel: Er basiert auf timer und rand/srand
und im weiteren Rechenverlauf auf sqrt und den Winkelfunkt.
eines bel. Dreiecks, wenn p,q,h bekannt sind und man in Richtung
einiger Teile von alpha,beta,gamma rechnet.Da ich gerade mit c++ erst anfange und für dieses Hobby nur wenig zeit habe,
wirds wohl noch dauern.
-
Also wenn du mit Winkelfunktionen rumspielst, dann sollte das Teil dann aber auch double zurückliefern. Ich bezweifle doch stark, dass du damit Ganzzahlen herausbekommst. Dann erübrigt sich der Modulo-Unsinn, da Modulo für Fließkommazahlen nicht definiert ist.
-
Ja das ist richtig.
Die winkel werden wohl double werden, aber das sind
ja nicht die endgültigen Zahlen, sondern nur Teile davon,
die dann letztenendes int sein können.**
So ich muss mich jetzt vorerst verabschieden.
Wie gesagt, für dieses Hobby bleibt leider nur wenig zeit.
Bis hoffentlich zum nächsten mal.**
-
Swordfish schrieb:
Du musst denken beim Programmieren.
Also die Aussage lob ich mir doch mal...
Vllt. sollte es im 'Info-Thread' des C++-SubFoums heißen:
[...]Bevor ihr ein neues Thema startet, benutzt bitte die Suchfunktion, werft einen Blick in die FAQs und denkt!.
Das scheinen einige zu vergessen
.
-
iceborg01 schrieb:
@ Michael: weil ich vorhin schon schrieb, dass die anderen Algos nicht
linear sind und für z. B. q = 2 z = 3 liefern u. ä.Und?