Losowanie bez powtórzeń

dawidczaju
Użytkownik
Użytkownik
Posty: 20
Rejestracja: 25 lut 2007, o 19:14
Płeć: Mężczyzna
Lokalizacja: Zabrze

Losowanie bez powtórzeń

Post autor: dawidczaju »

Witam. Szukałem na forum odnośnie kodu losowania bez powtórzeń ale znajdowałem tylko z powtórzeniami i lotka. Chodzi dokładnie o wylosowanie 6 liczb ze zbioru o wielkości takiej jaką poda użytkownik. Próbowałem napisać ten program ale coś mi nie wychodzi. Gdzieś jest jakiś błąd bo przepisywałem z wykładów ale nie działa poprawnie :D

Kod: Zaznacz cały

program losowanie;

type 
TTab=array[1..6] of real;

var
t1:TTab;
j,i,x,n: integer;
dobra:boolean;

begin
randomize;

writeln('Podaj z ilu liczb mam wylosować szóstkę: '); {z pominięciem tego, że może podać mniej niż 6}
readln(x);
i:=0;
j:=1;
repeat

   n:=random(x)+1;
   dobra:=true;

for j:=1 to i do
   if n=t1[i] then dobra:=false;
   if dobra then begin
      i:=i+1;
      t1[i]:=n;
      write(' ', t1[i]:2:0);
   end;
until i=6;
readln;
end.
Jakieś pomysły? :)
kaszubki
Użytkownik
Użytkownik
Posty: 867
Rejestracja: 12 kwie 2008, o 13:35
Płeć: Mężczyzna
Podziękował: 6 razy
Pomógł: 78 razy

Losowanie bez powtórzeń

Post autor: kaszubki »

Ja tam znam tylko c++, ale ogólnie chodzi o to, że tworzymy tablicę, losujemy liczbę, wkładamy ją na pierwsze miejsce tablicy, a później losujemy kolejną, sprawdzamy, czy nie jest taka sama, jak któraś z tablicy, i jeśli jest taka sama, to losujemy dalej, aż będzie różna. A jeśli jest inna, to wkładamy do tablicy.
dawidczaju
Użytkownik
Użytkownik
Posty: 20
Rejestracja: 25 lut 2007, o 19:14
Płeć: Mężczyzna
Lokalizacja: Zabrze

Losowanie bez powtórzeń

Post autor: dawidczaju »

Odkrywcze
matshadow
Użytkownik
Użytkownik
Posty: 941
Rejestracja: 17 gru 2007, o 21:48
Płeć: Mężczyzna
Lokalizacja: Kingdom Hearts
Podziękował: 6 razy
Pomógł: 222 razy

Losowanie bez powtórzeń

Post autor: matshadow »

mam lepszy pomysł, ale zadziała tylko dla liczb nieujemnych całkowitych - zamiast co chwilę przeszukiwać tablicę, zrobić tablicę booli od 0 do n, a potem po prostu losować liczbę i sprawdzać, czy tablica[liczba_wylosowana]=true. Jak tak, to zmienić na false i wypisać liczbę. A tak właściwie wywal
var t1:TTab i wszędzie gdzie jest t1, zmień na TTab
Xitami

Losowanie bez powtórzeń

Post autor: Xitami »

Zamiast
if n=t1[ i ] the
powinno być
if n=t1[ j ] then

Tablica X wartości, choćby bitów może być spora.

To samo ale nie tak samo, chyba ładniej.

Kod: Zaznacz cały

var
    t:array[1..6] of integer;
    i,n,x:integer;
begin
    readln(x);
    n:= 0;
    randomize;
    repeat
        i:= 1;
        t[n+1]:= random(x)+1;
        while t[n+1] <> t[i] do
            i:= i+1;
        if i>n then
            n:= n+1;
    until n = 6;
    for i:= 1 to 6 do 
        write(t[i],#32)
end.
ODPOWIEDZ