Program lotto

Odpowiedz Nowy wątek
xcfaniaqsx
2006-11-14 12:45
xcfaniaqsx
0

Witam! Mam problem mianowicie napisałem program lotto ktory losuje 6 liczb z 49 i nie wiem co dopisac aby nie losowal powtarzajacych sie liczb

program lotto;
uses crt;
TYPE wektor=array[1..6] of integer;
var
losowanie:wektor;

procedure wyswietl(var t:wektor);
var i:integer;
begin
writeln('dzisiejsze szczesliwe nr to: ');
for i:=1 to 6 do
write(t[i],' ');
end;

procedure wylosuj(var t:wektor);
var i,l:integer;
begin
for i:=1 to 6 do
begin
l:=random(10)+1;
t[i]:=l;
end;
end;

begin
randomize;
clrscr;
wylosuj(losowanie);
wyswietl(losowanie);
repeat until keypressed;
end.

Pozostało 580 znaków

2006-11-14 13:37

Rejestracja: 14 lat temu

Ostatnio: 8 lat temu

0

zrob sobie tablice 2 wymiarowa :) gdzie oprocz liczby bedziesz mial znacznik czy liczba byla juz wylosowana :) np. 0 - nie, 1 - tak

Pozostało 580 znaków

2006-11-14 14:04

Rejestracja: 15 lat temu

Ostatnio: 6 lat temu

0

Mam gdzieś gotowy kodzik. Zwykłą pętelką można sprawdzić, czy liczba się powtórzyła. Jeżeli tak to losuj aż do skutku.


wiem, że nic nie wiem

Pozostało 580 znaków

2006-11-14 15:36

Rejestracja: 13 lat temu

Ostatnio: 6 lat temu

0
TYPE
 TNumer   = ARRAY [1..49] OF Byte;

 FOR i := 1 TO 49 DO Numer[i] := i;   { tablica wypelniona liczbami 1..49 }

VAR  Temp :Byte;
BEGIN
 FOR i := Random(200{1000}) DOWNTO -99 DO
  FOR j := Random(N)+1 DOWNTO 1 DO
   BEGIN
    Temp := Numer[j];
    Numer[j] := Numer[1];
    Numer[1] := Temp;
   END;

<span style="color: blue">"Kolarstwo to jedna z najtrudniejszych dyscyplin sportu. Nawet najgorszy kolarz jest wciąż wybitnym sportowcem."
s.p. Marco Pantani
</span>

Pozostało 580 znaków

2006-11-14 17:33

Rejestracja: 14 lat temu

Ostatnio: 3 lata temu

0
program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils;

  Procedure LosujBezwzrotnie (ZIlu:byte;var Wynik:array of Byte);
  var
  Bemben:array of Byte;
  i,wsk:byte;
  begin
  Randomize;
  SetLength(Bemben,Zilu);
  for i:= 0 to High(Bemben) do
  Bemben[i]:=i+1;
  for i:= Low(Wynik) to High(Wynik) do
    begin
    Wsk:=Random(Length(Bemben));
    Wynik[i]:=Bemben[Wsk];
    Bemben[Wsk]:=Bemben[High(Bemben)];
    SetLength(Bemben,Length(Bemben)-1);
    end;
  end;

  var
  Wynik : array[1..6] of byte;
  i:byte;
  begin
  LosujBezwzrotnie(49,Wynik);
  for i:=Low(Wynik) to High(Wynik) do
  Write(Wynik[i],',');
  readln;
  readln;
  end.

;-P Pozdrawiam

Pozostało 580 znaków

xcfaniaqsx
2006-11-15 09:55
xcfaniaqsx
0

to zastosowac pętle WHILE..DO ?

Pozostało 580 znaków

xcfaniaqx
2006-11-15 09:57
xcfaniaqx
0

albo napisz mi do programu jak to ma wygladac :-) bylbym wdzieczny

Pozostało 580 znaków

2006-11-15 13:34

Rejestracja: 15 lat temu

Ostatnio: 1 miesiąc temu

0

Piotrekdb podał rozwiązanie.
(Po losowaniu zamiast przesuwać, można w miejsce wylosowanego wstawić ostatni)

Pozostało 580 znaków

xcfaniaqsx
2006-11-15 16:38
xcfaniaqsx
0

dla mnie to nie jest rozwiązanie... on podał całkiem inny program

program lotto;

uses crt;

TYPE wektor=array[1..6] of integer;

var
  losowanie: wektor;

procedure wyswietl(t:wektor); {po co var był?}
var
 i:integer;
begin
 writeln('dzisiejsze szczesliwe nr to: ');
 for i:=1 to 6 do
     write(t[i],' ');
end;

procedure wylosuj(var t:wektor);
var
  i,j:integer;
  ponow: boolean;
begin
  t[1]:=random(49)+1; {pierwszą losujemy}
  for i:=2 to 6 do {pozostałe musimy sprawdzać z wszystkimi poprzednikami:}
     repeat
         tab[i]:=random(49)+1;
         ponow:=false;
         for j:=1 to i-1 do
            if (tab[i]=tab[j]) then begin {jeśli już była - powtórzymy losowanie}
                ponow:=true;
                break;
            end;
      until not ponow;
end;

BEGIN
   randomize;
   clrscr;
   wylosuj(losowanie);
   wyswietl(losowanie);
   getch(); {szkoda niepotrzebnej petli}
END.

a to powinno być tak

Pozostało 580 znaków

xcfaniaqsx
2006-11-15 16:47
xcfaniaqsx
0

dla mnie to nie jest rozwiązanie... on podał całkiem inny program

program lotto;

uses crt;

TYPE wektor=array[1..6] of integer;

var
  losowanie: wektor;

procedure wyswietl(t:wektor); {po co var był?}
var
 i:integer;
begin
 writeln('dzisiejsze szczesliwe nr to: ');
 for i:=1 to 6 do
     write(t[i],' ');
end;

procedure wylosuj(var t:wektor);
var
  i,j:integer;
  ponow: boolean;
begin
  t[1]:=random(49)+1; {pierwszą losujemy}
  for i:=2 to 6 do {pozostałe musimy sprawdzać z wszystkimi poprzednikami:}
     repeat
         tab[i]:=random(49)+1;
         ponow:=false;
         for j:=1 to i-1 do
            if (tab[i]=tab[j]) then begin {jeśli już była - powtórzymy losowanie}
                ponow:=true;
                break;
            end;
      until not ponow;
end;

BEGIN
   randomize;
   clrscr;
   wylosuj(losowanie);
   wyswietl(losowanie);
   getch(); {szkoda niepotrzebnej petli}
END.

a to powinno być tak

Pozostało 580 znaków

2006-11-15 20:56

Rejestracja: 15 lat temu

Ostatnio: 1 miesiąc temu

0

Program piotrka robi dokładnie to samo, w zasadzie nie jest program tylko procedura lasująca, której brakuje tylko wyświetlenia. Jest też statystycznie poprawna.
Napisałeś "po co var był?", lepiej nawet byłoby napisać "procedure wyswietl(const t:wektor)".
Dodanie VAR ociupinkę przyśpiesza i zmniejsza zapotrzebowanie na pamięć. Bez VAR tworzona jest kopia tablicy, istnieje też spore ograniczenie na wielkość zmiennych lokalnych.

To samo na sposób Piotrka w wersji uproszczonej.

 const
   n=49;
   k= 6;
var
   t:array[0..n-1] of dword;
   i,j,x: dword;
begin
   randomize;
   for i:=0 to n-1 do
      t[i]:=i+1;

   for i:=0 to k-1 do begin
      j:=random(n-i);
      x:=t[i]; t[i]:=t[j]; t[j]:=x;
   end;

   for i:=0 to k-1 do
      write(t[i]:8);
end.

Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0