AGB  ·  Datenschutz  ·  Impressum  







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

Zufallszahl ziehen ohne wiederholung

Offene Frage von "walli18"
Ein Thema von walli18 · begonnen am 6. Feb 2009 · letzter Beitrag vom 17. Feb 2009
 
Benutzerbild von _frank_
_frank_

Registriert seit: 21. Feb 2003
Ort: Plauen / Bamberg
922 Beiträge
 
Delphi 3 Professional
 
#11

Re: Zufallszahl ziehen ohne wiederholung

  Alt 7. Feb 2009, 00:39
Zitat von walli18:
Die letztendliche zufallszahl soll als Integerwert Schwierigkeitsgrad heißen.(Das ist zwar eine blöde Bezeichnung, aber ich habe bis jetzt die Lösungen und Fragen damit schon bezeichnet, deswegen wäre das nicht schlecht, die Zufallszahl gleich so auszugeben)
halte ich für ungünstig, den zufallszahlen einer liste mit verschiedenen "Funktionen" zu belegen.oder hab ich dich falsch verstanden....die zufallszahl sollte schon unabhängig der liste gezogen werden.

Zitat von walli18:
Das wäre die Theoretische Lösung, ich hofe, dass mir das jemand in nen Quelltext packen kann!
Ich freue mich schon auf die Antworten!!
der Großteil wurde doch schon gelöst...bisschen Eigeninitiative wäre schon wünschenswert.

hatte bisschen Langeweile und hab das ganze mal zu Übungszwecken (und zur Verwirrung) absichtlich bisschen komplexer gelöst *g*:

Delphi-Quellcode:
var
  numbers:array[0..1] of cardinal;
...
function allBitsSet(maxvalue:integer):boolean;
var max1,max2:boolean;
begin
  if maxvalue>32 then
  begin
    max1:=(numbers[0] xor ($FFFFFFFF))=0;
    max2:=(numbers[1] xor ((1 shl (maxvalue-32))-1)=0)
  end else
  begin
    max1:=(numbers[0] xor ((1 shl maxvalue)-1)=0);
    max2:=true;
  end;
  result:=max1 and max2;
end;

function GetRndNumber(maxvalue:byte):byte;
var bitpos,idx:byte;
    mynumber:byte;
begin
  result:=0;
  if maxvalue>64 then exit;
  //abruchbedingung, wenn alle bits gesetzt sind

  if allbitsset(maxvalue) then
  begin
    showmessage('maximale anzahl der Zufallszahlen erreicht');
    exit;
  end;
  while result=0 do
  begin
    mynumber:=random(maxvalue)+1;
    idx:=(mynumber-1) div 32;
    bitpos:=mynumber-(idx*32);
    if (numbers[idx] and (1 shl (bitpos-1)))=0 then
    begin
      numbers[idx]:=(numbers[idx] or (1 shl (bitpos-1)));
      result:=mynumber;
    end;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var n:byte;
begin
  n:=GetRndNumber(40);
  label1.caption:=inttobin(numbers[0]);
  label2.caption:=inttobin(numbers[1]);
  ShowMessage(IntToStr(n));
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  randomize;
  numbers[0]:=0;
  numbers[1]:=0;
end;
vielleicht ist ja die eine oder andere funktion hilfreich.
hab grade mit TLargeIntger rumgespielt und da wollte ich bisschen rumspielen

mal im Ernst, die array-Variante von Marc ist schon die effektivste

Gruß Frank
  Mit Zitat antworten Zitat
 


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 00:42 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