Entwickler-Ecke

Sonstiges (Delphi) - Zahlengenerator(16 Zahlen je 0-9)


cornen - Mo 07.06.10 16:59
Titel: Zahlengenerator(16 Zahlen je 0-9)
Hey^^
Ich schaffe es irgentwie nicht einen Zahlengenerator zu baun :/
Bei meinem letzten versuch war die Zahl nicht 16 Stellig sondern über 50-.-
Könnte mir jemand pls die source geben wäre ganz ganz nett =D


Moderiert von user profile iconNarses: Topic aus VCL (Visual Component Library) verschoben am Mo 07.06.2010 um 20:29


Tryer - Mo 07.06.10 17:13

Wie sah dein Versuch denn aus?


Arbengie - Mo 07.06.10 17:16

Tipp:

unit math;

RandomRange(0,9);


FinnO - Mo 07.06.10 17:20


Quelltext
1:
2:
Für i 1 bis 16
  Zahl := Zahl + Random(10) * 10 hoch i


Tryer - Mo 07.06.10 17:38

Fast.. die höchstwertige Stelle sollte nicht Null sein ;)


FinnO - Mo 07.06.10 17:46

war ja nur ne anregung *beleidigt sei* Stand aber auch nirgends in den Forderungen, dass er es anders wollte. 16 Zahlen 0 - 9... das habe ich schon sehr weit interpretiert.


Tryer - Mo 07.06.10 17:52

Auslegungssache, brauchst nicht beleidigt sein :beer:
Für mich ist halt 0000000000000001 keine 16stellige Zahl, und es ist ja auch von meiner Seite nur als Anregung für den TE gedacht.

Grüsse, Dirk


ThunderDragon - Di 08.06.10 09:36


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
uses
  Math;

function Generate(Min,Max,Count: Integer): Int64;
var
  lCnt: Int64;
begin
  Randomize;
  Result := 0;
  lCnt := 1;
  while Power(10,Count - 1) >= lCnt  do
  begin
    Result := Result + lCnt * Math.Max(1,(Random(Max - Min + 1) + Min));
    lCnt := lCnt * 10;
  end;
end;



Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Button1.Caption := IntToStr(Generate(0,9,16));
end;


Gruß

Edit: Bei Count 18 ist aber Feierabend ^^. und Werte für Min und Max < 0 bzw > 9 sind nicht abgefangen.


Tryer - Di 08.06.10 20:07

Einfache Variante für 16stellige Zahl:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
function Rnd16DigitNumber: Int64;
var
  i: Integer;
begin
  Result := Random(9) + 1;
  for i := 1 to 15 do
    Result := Result * 10 + Random(10);
end;

oder (auch ohne Bereichskontrolle)

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
function Generate(MinDigit, MaxDigit, DigitCount: Integer): Int64;
var
  i: Integer;
begin
  if MinDigit = 0 then
    Result := Random(MaxDigit) + 1
  else
    Result := Random(MaxDigit - MinDigit + 1) + MinDigit;
  for i := 1 to Pred(DigitCount) do
    Result := Result * 10 + Random(MaxDigit - MinDigit + 1) + MinDigit;
end;

Grüsse, Dirk


Kha - Di 08.06.10 21:04

*hust* Denkt nochmal drüber nach, ob sich das nicht auch mit einem einzigen Random-Aufruf lösen lässt (ich spreche von Zahlen mit den Ziffern 0-9, alles andere war nicht gefragt) ;) .


Tryer - Di 08.06.10 21:14

Im FrageText war von 16stellig die Rede.. daher der zusätzliche Aufruf am Anfang. Klar kann man den weglassen wenn Zahlen mit "bis zu 16 Stellen" gesucht werden.
Ein einfacher Random-Aufruf reicht leider nicht, da der einen Integer (max. 10stellig) zurückgibt.

Grüsse, Dirk


Kha - Di 08.06.10 21:33

Ah, mit Int64 hast du natürlich recht. Aber auch dann genügen 2 statt 16 Aufrufe (oder weiterhin einer mithilfe von Random()) - egal, wie man "16-stellig" nun definiert.


Tryer - Di 08.06.10 22:22

Ich hab nicht viel Ahnung von Wahrscheinlichkeitsrechnung, aber wäre bei zwei Aufrufen nicht die Zufälligkeit reduziert? Wenn Random(100000000) mit gleicher Wahrscheinlichkeit "1" und "99999999" liefert heisst das für mich das die höherwertigen Stellen mit steigender Wahrscheinlichkeit Null (nicht gesetzt) sind wenn ich das immer als "8 Ziffern" auswerte. Somit wäre "0" die Ziffer mit der höchsten Wahrscheinlichkeit.
Durch das Setzen der einzelnen Ziffern wäre ist die Verteilung demnach zufälliger und somit vorzuziehen.

Grüsse, Dirk