AGB  ·  Datenschutz  ·  Impressum  







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

Zufals-Boolean erzeugen

Ein Thema von ManuMF · begonnen am 25. Sep 2005 · letzter Beitrag vom 27. Sep 2005
Antwort Antwort
Seite 4 von 6   « Erste     234 56      
tigerman33

Registriert seit: 30. Jul 2005
Ort: München
423 Beiträge
 
Delphi 2005 Professional
 
#31

Re: Zufals-Boolean erzeugen

  Alt 26. Sep 2005, 09:23
Eine andere Variante, wenn man das Array umgehen will (obwohl das ja auch eine gute Lösung ist) wäre auch folgendes:

ABool := random <= (f - n) / (s - m) Dabei ist f die Anzahl an trues die man erreichen will, s die Spanne in der das erreicht werden soll (in eurem Beispiel 1000). n und m sind Zählervariablen, in denen die Anzahl an schon erreichten trues bzw. die schon verstrichene Spanne gespeichert wird.

Beispiel: Im 20. von 1000 Würfen, es ist schon 3 mal true gewürfelt worden und soll insgesamt 500 mal true geben:#

ABool := random <= (500 - 3) / (1000 - 19)
Christian
Der Computer hilft mir, Probleme zu lösen, die ich ohne Computer nicht hätte.
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#32

Re: Zufals-Boolean erzeugen

  Alt 26. Sep 2005, 12:33
Was ist mit

Result := Odd(Random(100)); Gruß Hagen
  Mit Zitat antworten Zitat
Benutzerbild von Nikolas
Nikolas

Registriert seit: 28. Jul 2003
1.528 Beiträge
 
Delphi 2005 Personal
 
#33

Re: Zufals-Boolean erzeugen

  Alt 26. Sep 2005, 15:02
Zitat:
Result := Odd(Random(100));
Es geht schon nicht mehr darum, einen zufälligen Boolean zu bekommen, sondern Möglichkeiten zu garantieren (!) dass True und False gleich oft erscheinen.

// Hast du eigentlich einen Bot, der meldet, wenn in einem Thread eines der Wörter 'Zufallalgorhytmus' oder 'Veschlüsselung' auftaucht?
Erwarte das Beste und bereite dich auf das Schlimmste vor.
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#34

Re: Zufals-Boolean erzeugen

  Alt 27. Sep 2005, 06:58
Ja und ? Das macht exakt mein Vorschlag, denn der PRNG muß als guter RNG garantieren das er auf lange Sicht gerade und ungerade Zahlen gleichmäßig verteilt.

Davon abgesehen, eine Garantie das man bei 1000 zufällig erzeugten Booleans exakt 50% jeweils TRUE oder FALSE sind kann es bei Zufall eben nicht geben. Dies wäre nämlich nicht mehr zufällig, also ein Widerspruch insich. Entweder will man es zufällig oder nicht.
Eine Folge von 1000 erzeugten TRUE Werten ist zwar sehr unwahrscheinlich aber denoch ein möglicher und gültiger Output eines Zufallsgenerators.

Gruß Hagen
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#35

Re: Zufals-Boolean erzeugen

  Alt 27. Sep 2005, 07:04
Es besteht aber die Möglichkeit eine solche "Zufallssequenz" ganz einfach zu erzeugen.

Delphi-Quellcode:
var
  LastValue: Boolean;
  LastValid: Boolean := False;

function RandomBoolean: Boolean;
begin
  if not LastValid then
    LastValue := Odd(Ramdom(2));
  Result := LastValue;
  LastValue := not LastValue;
  LastValid := not LastValid;
end;
Diese Funktion erzeugt Tuples aus TRUE/FALSE bzw FALSE/TRUE Werten zufällig. Ruft man sie also mit geradzahliger Anzahl auf so ist garantiert das 50% TRUE/FALSE sind. Der maximale Abstand zwischen zwei TRUE bzw FALSE Werten beträgt 2.

Aus dieser kleinen Funkton lässt sich sehr einfach mathematisch ableiten das wenn man längere uniforme Abstände erreichen möchte sich die WorstCase-Gleichverteilung immer weiter von 50% entfernen muß. Und bei "echt" zufälligen Sequenzen die mathematisch mögliche WorstCase-Gleichverteilung exakt einer unendlich langen Sequenz sein muß. Heist auch eine unendlich lange Sequenz aus lauter TRUE oder FALSE Werten ist eine wahrscheinlich mögliche zufällige Sequenz.

Gruß Hagen
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#36

Re: Zufals-Boolean erzeugen

  Alt 27. Sep 2005, 07:19
Zitat von alzaimar:
@Olli:Ob ich nun
bRand := Boolean (Random (2)) nehme, oder
bRand := Boolean (Random (10000) mod 5000) ist, zumindest beim Delphi-Randomgenerator, auch mathematisch ein und die selbe Sosse.
Nein ist es nicht. Beide Lösungen sind schlichtweg falsch da der direkte Cast eines Integers nach Boolean syntaktisch absolut undefiniert ist.

PASCAL konforme Lösungen wären:

Delphi-Quellcode:
begin
  Result := Odd(Random(2));

  Result := Random(2) <> 0;
  
  Result := Random(2) = 0;

  Result := Random(1000) >= 500;
end;


const
  Boolean: array[0..1] of Boolean = (False, True);
begin
  Result := Boolean[Random(2]);
end;
alles andere ist Quatsch mit Sosse.

Gruß Hagen
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#37

Re: Zufals-Boolean erzeugen

  Alt 27. Sep 2005, 08:39
Zitat von negaH:
eine Garantie das man bei 1000 zufällig erzeugten Booleans exakt 50% jeweils TRUE oder FALSE sind kann es bei Zufall eben nicht geben. Dies wäre nämlich nicht mehr zufällig, also ein Widerspruch insich.
Das freut mich zu hören, denn auf mich hört ja keiner
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

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

Re: Zufals-Boolean erzeugen

  Alt 27. Sep 2005, 09:07
Zitat von negaH:
Zitat von alzaimar:
@Olli:Ob ich nun
bRand := Boolean (Random (2)) nehme, oder
bRand := Boolean (Random (10000) mod 5000) ist, zumindest beim Delphi-Randomgenerator, auch mathematisch ein und die selbe Sosse.
Nein ist es nicht. Beide Lösungen sind schlichtweg falsch da der direkte Cast eines Integers nach Boolean syntaktisch absolut undefiniert ist.
Klappt aber (bis auf das ... mod 5000, was mod 2 heissen sollte) wunderbar und liefert unter Delphi gleichverteilte Boolsche Werte.

Prinzipiell hast Du aber Recht, denn das Typecasting Bool-->Integer ist von System zu System unterschiedlich implementiert.

Aber bitte, in Zukunft mit Mass kritisieren und vorher vielleicht das eine oder Andere ausprobieren.

Unabhängig davon hört in dem Thread sowieso keiner auf den Anderen. Ich hatte schon vorher das Paradoxon mit den 'garantiert gleichverteilten 1000 Zufallszahlen' erklärt, aber das wurde ignoriert. Na nun, egal.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#39

Re: Zufals-Boolean erzeugen

  Alt 27. Sep 2005, 14:35
@alzaimar:

ich weis das dies funktioniert. Aber nur weil der Compiler einen Boolean als

FALSE = 0
TRUE <> 0

ansieht, was aber nicht offiziell dokumentiert ist. Der Compiler kann diese Logik benutzen weil auf Intel CPUs die Anfrage auf == 0 oder <> 0 über die Prozessorflags und deren Auswertung per Bedingte Sprünge so easy ist. Würde der Borland Compiler aber zb. auf ARM Kernen laufen so ginge dies eben nicht mehr.
Offiziell ist ein Boolean aber als

FALSE = 0
TRUE = 1

definiert. Was aber keine plausible Begründung für (Integer mod 2) in [0,1] in Boolean sein darf, da sich diese Definition jederzeit ändern könnte.

Angenommen folgender Code:

Delphi-Quellcode:
function BooleanToString1(Value: Boolean): String;
const
  sBoolean: array[Boolean] of String = ('FALSE', 'TRUE');
begin
  Result := sBoolean[Value];
end;

function BooleanToString2(Value: Boolean): String;
const
  sBoolean: array[Boolean] of String = ('FALSE', 'TRUE');
begin
  Result := sBoolean[Value <> False];
end;

procedure Test;
var
  S: String;
begin
  S := BooleanToString1(Boolean(2));
  WriteLn(S);

end;

// und

begin
  if Boolean(2) then
  begin
    WriteLn('test');
  end;
end;
probier ihn aus.
Man muß dann schon BooleanToString2() benutzen um falsche TypCast zu eliminieren und den Code Bulletproof zu machen, was aber im Grunde nur duch die ungültigen TypCast zb. anderer Programmierer verursacht wurde.
Im zweiten Beispiel sieht man das der Compiler den Bytewert 2 einfach auf <> 0 abfragt und dieses über die Möglichkeiten der Intel CPUs als gültiges TRUE akzeptiert.

Das heist: solche ungültigen TypCast nach Boolean funktionieren innerhalb von Anfragen immer sauber, auf Grund der spezifischen Umsetzung in den Machinencode der Intel CPUs. Sie führen aber bei bestimmten PASCAL/Delphi konformen Sourcen, wie in BooleanToString1() gesehen, zu unvorhersehbarem Verhalten des Programmes. Dies wird dann zu Zugriffsverletzungen führen, obwohl der Code in BooleanToString1() absolut astreiner Delphi Source ist.

Wir alle können uns nun sicher vorstellen wie der Programmierer von BooleanToString1() stundenlang in seinem Sourcecode nach der Ursache dieser Zugriffsverletzungen suchen wird.

Gruß Hagen
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#40

Re: Zufals-Boolean erzeugen

  Alt 27. Sep 2005, 14:55
Zitat:
Ich hatte schon vorher das Paradoxon mit den 'garantiert gleichverteilten 1000 Zufallszahlen' erklärt, aber das wurde ignoriert. Na nun, egal.
Und weil dieser Hinweis essentiell richtig ist, und das nun schon von 3-4 Leuten mit anderen Worten gesagt wurde, habe ich's eben ein 5'tes mal wiederholt. Vielleicht wird es ja dann noch deutlicher

Aber, selbst wenn der Poster der Frage kein Intresse mehr an der Lösung dieser Frage hat, so ist die Wahrscheinlichkeit denoch sehr groß das später andere Antwortsuchende über diese Thread stolpern, und eben davon lernen. Soll heisen: die momentane "Ignoranz" muß man einfach akzeptieren und mit der Hoffnung vorlieb nehmen das Andere sich ihr Wissen rausziehen werden. Sieh es positiv

Gruß Hagen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 4 von 6   « Erste     234 56      


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 20:02 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