AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Delphi Zufallsgenerator mit Gewichtung (aber mit sehr großen Datenmengen)

Zufallsgenerator mit Gewichtung (aber mit sehr großen Datenmengen)

Ein Thema von Bambuti2000 · begonnen am 18. Jun 2014 · letzter Beitrag vom 18. Jun 2014
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.758 Beiträge
 
Delphi 12 Athens
 
#1

AW: Zufallsgenerator mit Gewichtung (aber mit sehr großen Datenmengen)

  Alt 18. Jun 2014, 07:51
Was bedeutet: "die Gewinnchance um 1 erhöhen"?

Soll jeder eingezahlte Euro von allen Kunden die gleiche Gewinnchance haben?

Dann würde ich erstmal die Gesamtsumme der Euros (G) ermitteln. Dabei musst du nur aufpassen, daß du beim Addieren keinen Integer-Überlauf erzeugst. Aus dieser Gesamtsumme ermittelst du dann eine Gewinnzahl (1..G). Danach durchläufst du die Eingabedatei nochmal, addierst alle Einzahlungen auf bis die Gewinnzahl erreicht bzw. überschritten wird. Der gerade eingelesene Kunde ist dann der Gewinner.

Wenn du mehrere (z.B. 10) Gewinner brauchst, kommt es darauf an, ob ein Kunde mehrmals gewinnen kann. Ist dies der Fall, kannst du gleich 10 Gewinnzahlen ermitteln und sortieren und das in einem Durchlauf erledigen. Andernfalls nimmst du nach jedem Gewinn den Kunden aus der Liste und führst das gesamte Verfahren mit den verbleibenden Kunden nochmal durch.

Das ist in etwa damit vergleichbar, als wenn jeder Kunde für jeden Euro ein Los in die Trommel geworfen hat.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#2

AW: Zufallsgenerator mit Gewichtung (aber mit sehr großen Datenmengen)

  Alt 18. Jun 2014, 07:55
Dann würde ich erstmal die Gesamtsumme der Euros (G) ermitteln. Dabei musst du nur aufpassen, daß du beim Addieren keinen Integer-Überlauf erzeugst. Aus dieser Gesamtsumme ermittelst du dann eine Gewinnzahl (1..G). Danach durchläufst du die Eingabedatei nochmal, addierst alle Einzahlungen auf bis die Gewinnzahl erreicht bzw. überschritten wird. Der gerade eingelesene Kunde ist dann der Gewinner.
Inwieweit unterscheidet sich das von meiner Lösung (Post #2)?
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#3

AW: Zufallsgenerator mit Gewichtung (aber mit sehr großen Datenmengen)

  Alt 18. Jun 2014, 08:19
Inwieweit unterscheidet sich das von meiner Lösung (Post #2)?
Ist doch offensichtlich: Uwe bittet nicht darum, als Gewinner eingetragen zu werden
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.758 Beiträge
 
Delphi 12 Athens
 
#4

AW: Zufallsgenerator mit Gewichtung (aber mit sehr großen Datenmengen)

  Alt 18. Jun 2014, 08:22
Dann würde ich erstmal die Gesamtsumme der Euros (G) ermitteln. Dabei musst du nur aufpassen, daß du beim Addieren keinen Integer-Überlauf erzeugst. Aus dieser Gesamtsumme ermittelst du dann eine Gewinnzahl (1..G). Danach durchläufst du die Eingabedatei nochmal, addierst alle Einzahlungen auf bis die Gewinnzahl erreicht bzw. überschritten wird. Der gerade eingelesene Kunde ist dann der Gewinner.
Inwieweit unterscheidet sich das von meiner Lösung (Post #2)?
Nur in der Implementierung.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Bambuti2000
Bambuti2000

Registriert seit: 11. Okt 2007
Ort: Troisdorf
44 Beiträge
 
Delphi XE2 Architect
 
#5

AW: Zufallsgenerator mit Gewichtung (aber mit sehr großen Datenmengen)

  Alt 18. Jun 2014, 09:33
Wunderbar, danke für die schnellen Antworten.

Besonderen Dank an Dejan Vu.
Wenn man sich das dann mal richtig überlegt, wird es auch klar und simpel.

Ich habe natürlich umgehend die Berechnung umgesetzt.
Das einzige was ich noch nicht so ganz verstehe ist
Zitat:
theWinner := Random (Summe) + 1;
warum +1 addiert wird.

Gruß
Stefan
Stefan
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#6

AW: Zufallsgenerator mit Gewichtung (aber mit sehr großen Datenmengen)

  Alt 18. Jun 2014, 09:36
Schau dir doch einfach mal die Online-Hilfe zu Random an:

In Delphi gibt Random eine Zufallszahl im Bereich 0 <= X < Range zurück.

Na, leuchtet's bereits?

Wenn nicht, dann schau dir mal im Debugger die Resultate an, wenn du bei Random als X-Wert z.B. 1 eingibst ... Jetzt sollte es aber deutlich leuchten bei dir ...
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.561 Beiträge
 
Delphi 12 Athens
 
#7

AW: Zufallsgenerator mit Gewichtung (aber mit sehr großen Datenmengen)

  Alt 18. Jun 2014, 09:53
Zitat:
Hier mal mein Code der zwar funktioniert, aber nur wenn ich die Summen um den Faktor 100 dividiere.
Das klingt ja fast so, als wenn du da irgendwo z.B. einen Integerüberlauf bekommst, wenn es bei großen Zahlen nicht mehr geht.
[edit] Oder eben ein Speicherproblem: Arbeitspeicher ist voller Strings und auch die StringList selbst besitzt eine maximale Anzahl an möglichen Einträgen, und zwar sind das ganz genau Max(NativeInt) div (SizeOf(Pointer) * 2) in Win32 sind das maximal 268.435.455 Einträge, wobei es effektiv (auf Grund des Arbeitsspeichers) vielleicht nur maximal 32.768.000 Zeilen sind (eher weniger, da ich davon ausgegangen bin, daß ein freier 250MB-Bereich zusammenhängend existiert und jede Zeile einen Leerstring enthält ).



Habt ihr über 2 Milliarden € (2.147.483.647) als Gesamt-Einlagen?

Wenn nicht, dann sollte es keinen Überlauf geben.
OK, wenn man die Extremwerte nimmt, dann schon (150000*1000000 = 150.000.000.000), aber in der durchschnittlichen Summe doch wohl nicht.

Annahme: pro 1€ gibt es eine Gewinnchance
- Maximum Bereich des Zufallswertes errechnen = Einlagen aller Leute (eventuell jeweils auf ganze € abgerundet)
- Zufallswert bestimmen = Random(Gesamteinlage)
- dann wieder die Kunden durchgehen und solange von dem Zusfallswert die jeweilige Einlage abziehen, bis der Wert unter 0 sinkt ... das ist dann der Gewinner.

[edit]
Also im Prinzip so, wie es schon genannt wurde.

Vom Vorgehen her ist es wie dein Code, nur das die "Liste" nicht in Real, sondern nur virtuell erstellt wird und es somit nahezu keinen Speicherverbrauch gibt.
Denn, wenn man diese Liste nicht auch noch vermischt, dann lässt sich mathematisch berechnen welche Person sich in jeder Zeile befindet.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (18. Jun 2014 um 10:07 Uhr)
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.740 Beiträge
 
Delphi 6 Enterprise
 
#8

AW: Zufallsgenerator mit Gewichtung (aber mit sehr großen Datenmengen)

  Alt 18. Jun 2014, 09:37
Wenn du Random(10) sagst, können die Zahlen 0..9 rauskommen.
Ralph
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#9

AW: Zufallsgenerator mit Gewichtung (aber mit sehr großen Datenmengen)

  Alt 18. Jun 2014, 09:41
Wenn du Random(10) sagst, können die Zahlen 0..9 rauskommen.
Falsch! Da kommen die Zahlen 0..10 heraus, wie ich oben bereits dargestellt habe. Es ist eher so: wenn du Werte von 1 bis 10 haben willst, nimmst du Random(9) und zählst 1 dazu.

Geändert von Perlsau (18. Jun 2014 um 09:55 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.758 Beiträge
 
Delphi 12 Athens
 
#10

AW: Zufallsgenerator mit Gewichtung (aber mit sehr großen Datenmengen)

  Alt 18. Jun 2014, 09:47
Wenn du Random(10) sagst, können die Zahlen 0..9 rauskommen.
Falsch! Da kommen die Zahlen 0..10 heraus, wie ich oben bereits dargestellt habe. Es ist eher so: wenn du Werte von 1 bis 10 haben willst, nimmst du Random(9) und zählst 1 dazu.
Perlsau - Sie reden wirr!
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:22 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-2025 by Thomas Breitkreuz