![]() |
Delphi-Version: BDS 2006
Zufallsboolean
Zufallsboolean
Folgende Funktion liefert Zufallsboolean. Es wurde mit BDS 2006 entwickelt.
Delphi-Quellcode:
Vielleicht kannst ja jemand brauchen.
{*******************************************************************************
Unit: uZufallsZahlen ltz.Ändr.: 13.07.2008 -------------------------------------------------------------------------------- 1.) Name: function ZufallsBoolean(): boolean; ltz.Ändr.: 13.07.2008 Beschreibung: Gibt zufällig TRUE oder FALSE als Boolean zurück Um den Zufallszahlengenerator zu initialisieren, rufen Sie Randomize einmal auf oder weisen der Variable RandSeed vor dem Aufruf von ZufallsBoolean einen Wert zu. -------------------------------------------------------------------------------- 2.) Name: function StrZufallsBoolean(): string; ltz.Ändr.: 13.07.2008 Beschreibung: Gibt zufällig 'TRUE' oder 'FALSE' als String zurück Um den Zufallszahlengenerator zu initialisieren, rufen Sie Randomize einmal auf oder weisen der Variable RandSeed vor dem Aufruf von ZufallsBoolean einen Wert zu. *******************************************************************************} unit uZufallsZahlen; interface uses SysUtils, Math; function ZufallsBoolean(): boolean; function strZufallsBoolean():String; implementation function ZufallsBoolean(): boolean; begin Result:= Random(2)=1; // 1=1 >> TRUE / 0=1 >> FALSE end; function StrZufallsBoolean():String; begin Result:= BoolToStr(ZufallsBoolean(),true); end; end. Bis bald Chemiker Edit: function ZufallsBoolean geändert und Dax-Vorschlag übernommen. |
Re: Zufallsboolean
Verbesserungsvorschlag:
Delphi-Quellcode:
Es ist nett, dass du das zur Verfügung stellst, aber am Ende hat es dann doch nicht den gewissen Mehrwert. ;)
function ZufallsBoolean: Boolean;
begin Result := Random(2) = 1; end; function ZufallsBoolean(trueProzent: Double): Boolean; begin Result := Random(100) < trueProzent; end; |
Re: Zufallsboolean
Und da Boolean ja 0 und ungleich 0 ist, kann man sich den Vergleich auf 1 oder 0 auch sparen :-)
Delphi-Quellcode:
result := Boolean(random(2));
|
Re: Zufallsboolean
Da ist was dran, aber mit dem Vergleich finde ich es schöner :)
edit: Wenn ich mich Recht erinnere, ist Boolean in Delphi sogar 0 oder 1. Ich glaube mich daran zu erinnern, dass Delphi aus dem "not" ein Integer "xor 1" macht - damit wäre "not Boolen(2)" immer noch true. |
Re: Zufallsboolean
Ja, ein Vergleich ist schöner. Schon allein deshalb, weil bei manchen Boolean-Typen, LongBool z.B., True nicht den Wert 1 hat, sondern $FFFFFFFF.
|
Re: Zufallsboolean
Hallo,
Währe nett, wenn Ihr das vielleicht in die Cod-Lib irgendwie mit aufnehmen könnt, weil ich danach gesucht habe. @ Dax: Deine Methode habe ich vorher so gehabt, wollte aber Sichersein das auch TRUE und FALSE rauskommt. Bis bald Chemiker |
Re: Zufallsboolean
Es kommt True oder False raus, mit jeweils 50% Chance für n -> unendlich. Random(X) ist definiert als 0 <= Random(X) < X, somit wird aus Random(2) = 1 in 50% der Fälle True. :)
|
Re: Zufallsboolean
Eine andere Möglichkeit wäre noch:
Delphi-Quellcode:
Dabei spart man sich die Umwandlung des Zufallswertes (der zwischen 0 und 1 liegt) in einen Integer, was u.U. schneller ist. Aber gut möglich, dass der Compiler das sowieso so optimiert.
function RandomBoolean: Boolean;
begin Result := Random() < 0.5; end; |
Re: Zufallsboolean
Zitat:
Delphi-Quellcode:
Name Size Ord(True)
Boolean 1 1 ByteBool 1 Any nonzero value WordBool 2 Any nonzero value LongBool 4 Any nonzero value |
Re: Zufallsboolean
Soweit ich weiss, ist das genau anders rum. Delphi erzeugt seine Zufallszahlen als einem Integer-Kongruenzgenerator und nutzt für die Periodizität das Überlaufverhalten der Integermultiplikation. Korrigiert mich, wenn ich falsch liege, ich hab schon so lange kein Delphi mehr :mrgreen:
|
Re: Zufallsboolean
Zitat:
Dann ist das Ergebnis u.U. weder True noch False. Lasst doch endlich den Schmarrn mit dem Boolean-Typecasting. Das gibt nur Probleme. |
Re: Zufallsboolean
Zitat:
|
Re: Zufallsboolean
Zitat:
|
Re: Zufallsboolean
Zitat:
Zitat:
Zitat:
Mal ehrlich: wenn es einen sauberen Weg gibt, sollte man ihn auch gehen, und nicht irgend einen dreckigen Seitenpfad, der verspricht, drei Meter kürzer zu sein. |
Re: Zufallsboolean
Zitat:
Delphi-Quellcode:
vermeiden sollte. IMO spricht nix gegen den typecast auf Boolean.
if x = true then
|
Re: Zufallsboolean
NL: Kompiliere bitte mal "a_bool := Boolean(2); b_bool := True; c_bool := a_bool xor b_bool;" und poste die Disassembly. Das würde mich echt mal interessieren, wie Delphi den Bool-Cast umsetzt...
|
Re: Zufallsboolean
Zitat:
Zitat:
Findest Du das in Ordnung? Du kannst mit gecasteten Booleans einfach nicht arbeiten. Punkt. |
Re: Zufallsboolean
Okay, jetzt verstehe ich, was du meinst. XOR liefert ein falsches Ergebnis. (@dax)
Bei random(2) ist es aber trotzdem egal, weil eh nur 0 oder 1 herauskommen kann, und ich denke nicht, dass der Wert von True einafch so in der nächsten Delphiversion geändert wird. Wenn man natürlich auf 100%ige Kompatiblität wert legt, ist die IF SCHLEIFE wohl die bessere wahl. Btw: mir fällt grad noch was ein:
Delphi-Quellcode:
Ist allerdings schon ziemlich entwartet, aber ob das wirklich sinnvoll bzw. schneller ist, ist wohl fraglich. (Bei True=1 wird der Compiler die Multiplikation ja hoffentlich eh rausoptimieren).
x := boolean(random(2)*ord(True));
edit: aber ist schon gut, ihr habt gewonnen :stupid: |
Re: Zufallsboolean
Zitat:
|
Re: Zufallsboolean
Hi,
Zitat:
@alzaimar: Da ist was dran. Ich denke folgendes Beispiel macht das mit =true besser verständlich:
Delphi-Quellcode:
Tja, true <> true, obwohl Äquivalenz vorliegt.
var
foo, bar: Boolean; foo := <Funktion aus DLL die -1 (true in anderen Sprachen) zurückgibt>; bar := <Funktion die 1 (derzeit true in Delphi) zurückgibt>; if foo = bar then blubb; <-- wird nicht ausgeführt Notfalls würde folgendes helfen, solange feststeht, dass 0 = false:
Delphi-Quellcode:
Hauptsache, der Compiler optimiert das nicht.
function equivalent(b1, b2: Boolean): Boolean; inline;
begin Result := (b1 = false) = (b2 = false); end; Oder so:
Delphi-Quellcode:
Vllt sollte man dieses Thema aufsplitten. Ich sehe es schon kommen, dass es hier um drei Themen geht: Zufallsboolean, Boolean-Werte außerhalb [true, false] und if-ist-keine-schleife.
function CorrectBool(b: boolean): boolean; inline;
begin Result := b <> false; end; Mfg FAlter |
Re: Zufallsboolean
Delphi-Quellcode:
result := odd(random(MaxInt));
|
Re: Zufallsboolean
Hallo zusammen,
boolean ist ja wohl die Interpretation einer Standardspeichergröße(Byte,Integer,Word....) Also sollte man nur mit If .. arbeiten. Sobald man dem Compiler ins Handwerk pfuscht, kann' mit der nächsten Version schon in die Hose gehen. Also bei Boolschen Ergebnissen nur True oder False zurückgeben nie irgendwelche Integer,Words etc. die als Boolean interpretiert werden müssen. Gruß K-H |
Re: Zufallsboolean
Zitat:
wie oben alzi schon erwähnt hat, gibt es verschiedene logische interpretationen... normal ist 0 = false und true nicht false... aber weshalb willste hier nur mit if arbeiten? eine zuweisung von b = a <> c, kann das CF auch b zuweisen... und so wäre die standardinterpretation in TP vollkommen exact zugewiesen... |
DP-Maintenance
Dieses Thema wurde von "Daniel G" von "Neuen Beitrag zur Code-Library hinzufügen" nach "Object-Pascal / Delphi-Language" verschoben.
Zu geringer Umfang für die CL, daher zurück ins normale Forum |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:02 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