Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi BigInt: RandomRange Funktion? (https://www.delphipraxis.net/119784-bigint-randomrange-funktion.html)

Z4ppy 31. Aug 2008 19:45


BigInt: RandomRange Funktion?
 
Ich hab mir diese BigInt-Klasse runtergeladen und in mein neustes Projekt eingebunden. Nun bräuchte ich da aber ein Pendant zur RandomRange-Funktion aus der Math-Unit... Gibts sowas? Wenn nein: Wie kann man sowas programmieren? Nach welchen Regeln muss man da vorgehen?

MfG Z4ppy

Z4ppy 1. Sep 2008 18:07

Re: BigInt: RandomRange Funktion?
 
*push*

MfG Z4ppy

blackdrake 1. Sep 2008 18:20

Re: BigInt: RandomRange Funktion?
 
Hallo.

In der Math.pas ist RandomRange definiert mit:

Delphi-Quellcode:
function RandomRange(const AFrom, ATo: Integer): Integer;
begin
  if AFrom > ATo then
    Result := Random(AFrom - ATo) + ATo
  else
    Result := Random(ATo - AFrom) + AFrom;
end;
Du brauchst also ein Random(), das mit BigInt funktioniert.

Leider enthält die BigInt.pas keine Random-Routine.

Eine Google recherche hat mich zu folgendem Forenbeitrag geführt:

http://www.delphi-forum.de/viewtopic...hlight=bignum2

Wenn du auf BigNum2 umsteigst, müsstest du eine Random()-Routine dabei haben.

Wenn es unbedingt BigInt sein muss, könntest du irgendwie das normale "Random(): Integer" so oft kopieren, sodass der BigInteger möglichst voll ausgenutzt wird. Das halte ich aber für etwas umständlich und unprofessionell. Folgender Code (der im Moment nicht funktioniert) als Denkanstoß:

Delphi-Quellcode:
function BigRandom(): TBigInt;
var
  i: integer;
  bg: TBigInt;
begin
  bg := TBigInt.Create;
  for i := 1 to (High(bg) div High(Integer)) do
  begin
    bg.Add(Random(High(Integer));
  end;
  result := bg;
end;
Dann müsstest du eben schauen, wie oft der Integer maximal in den BigInteger "reinpasst" (unter der Annahme, dass Random() stets den höchste Integer-Wert annimmt). Ich würde das mit einer For-Schleife, wie oben gezeigt, machen.

Gruß
blackdrake

Apollonius 1. Sep 2008 18:25

Re: BigInt: RandomRange Funktion?
 
Dummerweise sind die Zufallszahlen, die du mit der zweiten Methode erhältst, nicht gleich- sondern (annährend) normalverteilt.

blackdrake 1. Sep 2008 18:33

Re: BigInt: RandomRange Funktion?
 
Zitat:

Zitat von Apollonius
Dummerweise sind die Zufallszahlen, die du mit der zweiten Methode erhältst, nicht gleich- sondern (annährend) normalverteilt.

Da kenne ich leider nicht die mathematischen Hintergründe. Aber ich denke, dass es doch ziemlich egal ist, wie die Verteilung ist, wenn man nicht unbedingt mit Verschlüsselungen arbeitet. Bei der Verschlüsselung ist ja die normale Delphi-Variante von Random() sehr unsicher, da sie nur mit der Systemzeit rechnet und teilweise berechenbar ist. Wenn Random() also unsicher ist, dann ist es ja egal, ob man n verschiedene Random's zusammenaddiert, oder?

// Edit: Mein oben genannter Code ohne obere Grenze kann gar nicht funktionieren, da TBigInt theoretisch unendlich große Werte verwalten kann, also High(BigInteger) = unendlich.

Gruß
blackdrake

Z4ppy 1. Sep 2008 18:37

Re: BigInt: RandomRange Funktion?
 
Dummerweise arbeite ich mit Verschlüsselungen :D
Zum verlinkten Thema: Leider scheint in dieser Unit auch keine Random-Funktion enthalten zu sein :(
Gibts denn irgendwie "bessere" Random-Funktionen als die der Math-Unit?

MfG Z4ppy

Meflin 1. Sep 2008 18:40

Re: BigInt: RandomRange Funktion?
 
Zitat:

Zitat von Z4ppy
Gibts denn irgendwie "bessere" Random-Funktionen als die der Math-Unit?

Naja, wenn dus wirklich gut haben willst: Klick ;)

Apollonius 1. Sep 2008 18:51

Re: BigInt: RandomRange Funktion?
 
Die Windows-Crypto-API bietet die Funktion CryptGenRandom. Wenn du dir damit eine gewisse Anzahl zufälliger Bytes holst, hast du eine gleichverteilte Zufallszahl. Der einzige Nachteil ist, dass der Umfang deines Zahlenraums von der Form 2^n sein muss.

Dax 1. Sep 2008 18:52

Re: BigInt: RandomRange Funktion?
 
Das macht doch nix - aus den Bytes erstellt man eine BigInt-Instanz und nimmt Min(candidate, max) ;)

Apollonius 1. Sep 2008 18:54

Re: BigInt: RandomRange Funktion?
 
Das hat dann aber wirklich nichts mehr mit Gleichverteilung zu tun.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:11 Uhr.
Seite 1 von 3  1 23      

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