'Random (Menge)' machbar?

Von: , Frage gestellt am Di, 8. Sep 2009

Hi,

kann Pascal oder Delphi aus einer Menge (integer oder byte) mit dem
"random" ein Zufallszahl ziehen?

Bei mir gibts eine Fehlermeldung. Vielleicht mache ich etwas falsch.

8 Antworten zu dieser Frage

  1. Antwort von nach 55 Minuten 1 hilfreich
    Re: 'Random (Menge)' machbar?

    kann Pascal oder Delphi aus einer Menge (integer oder byte)
    mit dem
    Ja. Bei mir gibts eine Fehlermeldung. Vielleicht mache ich etwas
    falsch.
    Wie machst Du es denn? Welche Fehlermeldung?
    Dass man Euch sowas immer aus der Nase ziehen muss ...

    Manfred

    • Antwort von nach 23 Stunden 1 hilfreich
      Re^2: 'Random (Menge)' machbar?

      Hi.
      Habe die Menge z deklariert und wollte über random daraus eine Zahl ziehen. Fehlermeldung lautet:

      18 / 23 lotto4.pas Error: Incompatible type for arg no. 1: Got Set Of Byte, expected ULONG

      Der Code unten ist komplett, also einfach mal als pas. Datei speichern und laufen lassen.

      program Lotto;
      uses crt;
      var Zahl:array[1..6]of byte;
      var n:byte;
      var Z:set of 1..49;
      var wahl:string;
      label anfang,ende;

      begin

      anfang:
      randomize;
      Z:= [1..49];
      clrscr;
      for n:=1 to 6 do
      begin
      Zahl[n]:=random(Z)+1;
      Z:=Z+[Zahl[n]];
      write(Zahl[n]);

      end;

      gotoxy(3,7);
      writeln('Nochmal? <j>a <n>ein ');
      wahl:=readkey;
      clrscr;
      if (wahl='j') then goto anfang
      else goto ende;

      ende:
      end.

      • Antwort von nach einem Tag 0 hilfreich
        Re^3: 'Random (Menge)' machbar?

        Nochmal Hi,

        Reinhard Kern hat Dir weiter unten schon die Antwort gegeben!

        Das Problem bei der Sache ist, dass du eine gezogene Kugel nochmal ziehen könntest (dann ist das Element in der Menge leer). Das mußt du prüfen und solange weiterprobieren, bis du ein Element erwischst, was noch nicht gezogen wurde.

        Statt Deinen goto's solltest Du besser ordentliche Schleifen verwenden (Repeat oder While).

        LG
        Jochen

        PS:

        const
        Anz = 6;
        var
        Urne: set of 1..49;
        Wahl: array[1..Anz] of Byte;
        i,Nr: integer;
        vorhanden: boolean;
        begin
        Randomize;
        Urne := [1..49];
        for i := 1 to Anz do
        begin
        Repeat
        Nr := Random(49)+1;
        vorhanden := (Nr in Urne);
        if vorhanden then
        begin
        Wahl[i] := Nr;
        Urne := Urne - [Nr];
        end;
        until vorhanden;
        end;
        end;
        

        • Antwort von nach einem Tag 0 hilfreich
          Re^4: 'Random (Menge)' machbar?

          HI Reinhard Kern hat Dir weiter unten schon die Antwort gegeben!
          Das ist nicht die Lösung die ich finden wollte. Wollte es genauso wie in der Realität abhandeln, dass ein mehrmaliges ziehen erst gar nicht möglich ist.

          Die goto's bzw. labels find da eigentlich sehr passend weil ich nen readln drin habe und das Programm erstmal auf eine Eingabe wartet.

          • Antwort von nach einem Tag 0 hilfreich
            Re^5: 'Random (Menge)' machbar?

            Hallo,

            dir ist aber bekannt, dass die Verwendung von Goto zu den übelsten Programmierstilen gehört, weil der Code dadurch sehr unübersichtlich wird?.Dein Programm ließe sich mit einer einfachen repeat-until-Schleife deutlich übersichtlicher schreiben. Die goto's bzw. labels find da eigentlich sehr passend
            Mindestens dieser Teil ist absolut unpassend:

            if (wahl='j') then goto anfang
            else goto ende;
            ende:
            



            Da solltest Du vielleicht nochmal drüber nachdenken. Solche Dinge passieren, wenn man gotos verwendet.

            Gruß, Niels

            • Antwort von nach 5 Tagen 1 hilfreich
              Re^6: 'Random (Menge)' machbar?

              Ja. Ich werde über das Verwenden von labels nachdenken. Wofür sind die dann überhaupt gut?
              Bei Delphi kann man doch mehrere Units (werden die so genannt?) nutzen. In jeder steht ein bestimmter Teil des Programmes. Aber das wird mir zu kompliziert.

          • Antwort von nach einem Tag 0 hilfreich
            Re^5: 'Random (Menge)' machbar?

            Hallo, Das ist nicht die Lösung die ich finden wollte. Wollte es
            genauso wie in der Realität abhandeln, dass ein mehrmaliges
            ziehen erst gar nicht möglich ist.
            Ein Modell mit einer simulierten "echten Urne" habe ich Dir auch schon gezeigt: die verkettete Liste, wo man gezogene Einträge aus der Liste entfernen kann. Sowas geht IMHO nicht mit Mengen. Bei einer Menge mußt Du immer erst nachsehen, ob ein zufällig ausgewähltes Element (noch) in der Menge drin ist oder nicht (mehr).

            Solltest Du wider mein Wissen dennoch eine Lösung dafür finden, lass es mich wissen - das interessiert mich auch. Die goto's bzw. labels find da eigentlich sehr passend weil
            ich nen readln drin habe und das Programm erstmal auf eine
            Eingabe wartet.
            Nee, das ist nie passend. Das ist einfach kein guter Stil. Du kannst ja gerne auf eine Eingabe warten, aber eben innerhalb einer Schleife, die in abhängigkeit der Antwort ggf. abgebrochen wird:

            repeat
            # ziehe die Lottozahlen...
            # gib sie aus...
            writeLn("Nochmal (j/n)?");
            readLn(Antwort);
            until (Antwort <> "j");
            


            LG
            Jochen

            • Antwort von nach 5 Tagen 0 hilfreich
              Re^6: 'Random (Menge)' machbar?

              Hi Jo

              Mit verketteten Einträgen habe ich noch nie gearbeitet... :( Find ich ziemlich kompliziert. Solltest Du wider mein Wissen dennoch eine Lösung dafür
              finden, lass es mich wissen - das interessiert mich auch.
              Ich versuche es mal wie du sagst. Falls ich eine andere Lösung finde verkaufe ich sie an Microsoft oder IBM. Nee, das ist nie passend. Das ist einfach kein guter Stil.
              Jeder hackt immer auf den süßen Labels rum.

Keine passende Antwort gefunden? Jetzt eigene Frage stellen!