AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Zufallsfunktion

Ein Thema von Kharlanki · begonnen am 11. Jul 2007 · letzter Beitrag vom 12. Jul 2007
Antwort Antwort
Seite 1 von 2  1 2      
Kharlanki

Registriert seit: 9. Jul 2003
Ort: Düsseldorf
50 Beiträge
 
#1

Zufallsfunktion

  Alt 11. Jul 2007, 21:32
Hi,

ich suche eine Zufallsfunktion, die eine einigermassen gleichmaessige Verteilung ueber einem Intervall hat.

Beispiel: Ich moechte, dass z.B. alle 30 bis 60 Tage ein bestimmtes Ereignis eintritt und dass nach 45 Tagen in 50% der Faelle das Ereignis eingetreten ist. Und nicht etwa dass in den Tagen 30-35 in 90% der Faelle das Ereignis eingetreten ist und sich die uebrigen 10% dann auf die Tage 35-60 aufteilen.

Hat da jemand ne Idee?
Gruss,
Matthias

  Mit Zitat antworten Zitat
Stefan92

Registriert seit: 9. Jan 2007
146 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Zufallsfunktion

  Alt 11. Jul 2007, 22:09
Hallo,

als Zufallsfunktion würde ich "Random(x)", wobei das Ergebnis im Zahlenbereich von 0 bis x-1 liegt, empfehlen. Diese Funktion musst du aber erst mit Randomize irgendwo initialisieren.

Delphi-Quellcode:
if (tag > 30) and (tag < 60) then {Intervall von 30 Tagen}
  x:= random(30) + 30;
if tag = x then
  Ereignis;
if tag = 45 then
  x2:= random(2);
if x2 = 0 then
  tu_dies
else
  tu_jenes;
Das müsste an und für sich gehen. Hoffe, es ist verständlich genug

Gruß

Stefan
  Mit Zitat antworten Zitat
Kharlanki

Registriert seit: 9. Jul 2003
Ort: Düsseldorf
50 Beiträge
 
#3

Re: Zufallsfunktion

  Alt 11. Jul 2007, 22:41
Danke fuer deine Antwort. Aber leider hast du mich etwas missverstanden.

Die Tage sind die Zeit, die seit dem letzten "Ereignis" vergangen sind. Das Programm wird taeglich gestartet und wenn nun 30 Tage vergangen sind, wird mit einer bestimmten Wahrscheinlichkeit das "Ereignis" wieder eintreten und damit den Zaehler der vergangenen Tage wieder auf 0 setzen. Wurde das Ereignis am 30. Tag nicht ausgeloest, wird am 31. Tag wieder mit einer gewissen Wahrscheinlichkeit das Eintreten des Ereignisses bestimmt und so weiter. Die Wahrscheinlichkeit steigt hierbei weiter an, so dass spaetestens am 60. Tag das Ereignis ausgeloest wird.

Wenn ich nun diesen Zyklus (30 * Faktor) durchlaufe, sollten am 30.Tag bei (1 * Faktor) der Durchlaeufe das Ereignis ausgeloest werden, am 31. Tag wiederum (1 * Faktor) etc.

Wenn ich nun random(x)+y nehme, verteilt sich das dann beispielsweise so:
Durchlaeufe: 10000
Intervall: 0-10
0: 945
1: 939
2: 849
3: 711
4: 424
5: 409
6: 371
7: 362
8: 351
9: 401
10: 4238

Die Verteilung sollte aber gleichmaessig bei ca. 1000 pro Tag liegen.
Gruss,
Matthias

  Mit Zitat antworten Zitat
Stefan92

Registriert seit: 9. Jan 2007
146 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Zufallsfunktion

  Alt 11. Jul 2007, 22:47
Hm, da kann ich dir leider nicht helfen, da hab ich gar keine Idee.
Tut mir leid. Vielleicht weiss ja jemand anders Bescheid.

Gruß

Stefan
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#5

Re: Zufallsfunktion

  Alt 11. Jul 2007, 22:49
a) Du berechnest schon am 30. Tag, wann das Ereignis das nächste Mal eintreten soll.
b) Falls das aus irgendwelchen Gründen nicht möglich sein sollte, benutzen wir eben unseren alten Freund Mathematik: Random(VerbleibendeTageInklusiveHeute) = 0 wird dir die gewünschte Gleichverteilung liefern.
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Flare

Registriert seit: 26. Jan 2006
Ort: Leipzig
529 Beiträge
 
Delphi 7 Professional
 
#6

Re: Zufallsfunktion

  Alt 11. Jul 2007, 22:51
Ich würde es so lösen:

Delphi-Quellcode:
function new_random(ugrenze, ogrenze: integer): integer;
var i: integer;
begin
  Result := ugrenze;
  
  for i:=ugrenze to ogrenze do
    Inc(Result, Random(2));
end;
Da die Wahrscheinlichkeit zwischen 1 und 0 50% ist, dürfte das den gewünschten Effekt erzielen.

// Edit: Stimmt, muss ja Random(2) heißen


Flare
Willy Scheibel
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#7

Re: Zufallsfunktion

  Alt 11. Jul 2007, 22:59
? Willst du entweder 1 oder 0 generieren, musst du wie schon oben erwähnt Random(2) aufrufen. Wenn ich das richtig sehe, erzeugt deine Funktion allerdings eine Glockenkurve, also eine Normalverteilung.
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Flare

Registriert seit: 26. Jan 2006
Ort: Leipzig
529 Beiträge
 
Delphi 7 Professional
 
#8

Re: Zufallsfunktion

  Alt 11. Jul 2007, 23:04
Zitat von Khabarakh:
Wenn ich das richtig sehe, erzeugt deine Funktion allerdings eine Glockenkurve, also eine Normalverteilung.
Aber Kharlanki hat doch gesagt, dass bei 45 Tagen die Wahrscheinlichkeit 50% betragen soll und das interpretiere ich eindeutig als Glockenkurve.
Willy Scheibel
  Mit Zitat antworten Zitat
Rociel

Registriert seit: 13. Feb 2005
Ort: Könnern/MD
107 Beiträge
 
Delphi 2006 Personal
 
#9

Re: Zufallsfunktion

  Alt 11. Jul 2007, 23:12
nee:

Zitat:
und dass nach 45 Tagen in 50% der Faelle das Ereignis eingetreten ist.
mittelwert 30-60 is 45, also 50% und da soll die wahrscheinlichkeit bei 50% liegen, dass is den tagen 30 bis 45 das ereignis schon eingetreten ist, also bekommt jeder tag die gleiche wahrscheinlichkeit für das eintreten des ereignisses
Kommt ein Nullvektor zum Psychiater: "Herr Doktor, Herr Doktor ich bin so orientierunglos."
Mitglied der anonymen Algebraabhängigen
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#10

Re: Zufallsfunktion

  Alt 12. Jul 2007, 08:03
Kharlaki, Du musst einen Fehler gemacht haben. Weiterhin sind es 11 Ereignisse (0..10) und dann erwartet man bei 10000 Durchläufen 909 Treffer. Passiert mir aber auch immer wieder.

Hier, schau mal;

1x Button, 1x Memo, Doppelklick auf Button und dann;

Delphi-Quellcode:
Procedure TForm1.Button1Click (Sender : TObject);
Const
  ccSamples = 1000000;
  
Var
  Tage : Array [30..60] Of Integer;
  iZufallstag, iSumme, iZaehler : Integer;

Begin
  FillChar (Tage, SizeOf (Tage), 0);
  For iZaehler:=1 to ccSamples do Begin
    iZufallsTag := 30 + Random (31); // <==== *blink* hier ist die magische Zufallsfunktion ;-)
    inc (Tage[iZufallsTag]);
    End;
  Memo.Lines.Clear;
  iSumme := 0;
  For iZaehler:= 30 to 60 do begin
    inc (iSumme, Tage[iZaehler]);
    memo.Lines.add(Format ('Tag %d: %d, %3.1f %% ',[iZaehler,Tage[iZaehler],iSumme*100/ccSamples]));
    End;
End;
Liefert
  • Tag 30: 32168, 3,2 %
    Tag 31: 32155, 6,4 %
    Tag 32: 32360, 9,7 %
    Tag 33: 32308, 12,9 %
    Tag 34: 32338, 16,1 %
    Tag 35: 32309, 19,4 %
    Tag 36: 32259, 22,6 %
    Tag 37: 31980, 25,8 %
    Tag 38: 32209, 29,0 %
    Tag 39: 32467, 32,3 %
    Tag 40: 32137, 35,5 %
    Tag 41: 32355, 38,7 %
    Tag 42: 32066, 41,9 %
    Tag 43: 32359, 45,1 %
    Tag 44: 32247, 48,4 %
    Tag 45: 32241, 51,6 %
    Tag 46: 32202, 54,8 %
    Tag 47: 32544, 58,1 %
    Tag 48: 32229, 61,3 %
    Tag 49: 32630, 64,6 %
    Tag 50: 32275, 67,8 %
    Tag 51: 32144, 71,0 %
    Tag 52: 32374, 74,2 %
    Tag 53: 32482, 77,5 %
    Tag 54: 32348, 80,7 %
    Tag 55: 32376, 84,0 %
    Tag 56: 32065, 87,2 %
    Tag 57: 32259, 90,4 %
    Tag 58: 32103, 93,6 %
    Tag 59: 32114, 96,8 %
    Tag 60: 31897, 100,0 %
Nun gut, die 50% werden bei Tag 45 nicht getroffen, aber das geht mit der Vorgabe auch nicht, Denn es sind ja 31 Tage zwischen dem 30. und 60. Tag...

Was man aber nicht erwarten darf, das bei 31 Versuchen garantiert alle Tage getroffen werden. Wenn das erwünscht ist, dann bietet sich nur eine zufällige Permutation an. Dann ist das nur nicht mehr zufällig, sondern vermischt. Aber dafür nach jeweils 31 Durchläufen garantiert gleichverteilt.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 10:40 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz