Losowanie bez powtórzeń

0

Zaimplementowałem już funkcje losowania z listy, jednak czasami zdarzają sie powtórzenia zanim zostanie wylosowana każda wartość z listy. Chciałbym zrobić tak jak w losowaniu Lotto, wyjmujemy kulkę i kładziemy obok. Jak skończą się kulki to znów napełnić maszynę losującą.
Sek w tym że co jakiś czas liczba kul do losowania będzie się zmieniać.

Ja to zrobić? bo chwilowo to nie mam pojęcia.

Kombinowałem z tablicami - utnknąłem - z porównywaniem wartości z listy też.

0
var
bylo:array[1..zakres] of boolean;


repeat
x:=random(zakres)+1;
until bylo[x]=false;
bylo[x]:=true;

nie sprawdzane...

0

Zamiast losować i sprawdzać powtórzenia, stosuj mieszanie zbioru - wielokrotnie pozamieniaj miejscami losowe elementy, a potem bierz po kolei.

0

Ale chodzi o to by ze zbioru ubywało elementów.
Nawet mieszanie nie pomaga na to by nie wylosować powtórki zanim nie zostaną wylosowane wszystkie.

0
Osadnik napisał(a)

Ale chodzi o to by ze zbioru ubywało elementów.
Nawet mieszanie nie pomaga na to by nie wylosować powtórki zanim nie zostaną wylosowane wszystkie.
Jesteś pewny? Robisz tablicę n kolejnych wartości, zamieniasz miejscami losowo wybrane wartości. I gdzie masz powrtórzenia? Jakiś czas temu był temat w dziale C++ o tym. Potem pobierasz kolejne elementy tablicy aż do jej wyczerpania...

0

to zadam pytanie - jak mam utworzyć tablice o określonej długości - jest mi to potrzebne. opcja Lista : array[1..maxwartosc] of integer;
nie działa.
Wyskakuje mi że maxwartosć jest zła. Próbowałem na wszystkie inne sposoby. mogę podac tylko stała liczbę.

Potem muszę uszeregować ze wszystkie wartości w nowo stworzonej tablicy sa false.
I później wyciągając kulki z puli mogę je zamieniac na przeciwne.
Wszystko sie rozchodzi o utworzenie tej tablicy z pre definiowanymi wartościami i wybieranie właściwej. Jak dla mnie jest to nieco zagmatwane.

0

no to poczytaj o tablicach dynamicznych...

A losowe mieszanie to po prostu wylosowanie dla każdego indeksu losowej liczby i posortowanie tablicy względem tych wylosowanych liczb...
czyli np. masz po kolei liczby:

1,2,3,4,5,6,7,8,9

dla każdej losujesz liczbe, np.:
1 ,2 , 3 , 4 , 5 , 6 , 7 , 8 , 9
34,23,45,14,78, 4, 9 , 21,34

I sortujesz tablice według liczb wylosowanych:

6 , 7 , 4 , 8 , 2 , 1 , 9 , 3 , 5
4 , 9 ,14,21, 23, 34,34, 45,78

I masz losowy rozkład liczb bez powtórzeń ;)</image>

oczywiście liczby 1,2,3...9 mogą być zupełnie inne...

0

Aaa!

Teraz zajarzyłem to...
Teraz to muszę jakoś okodowac...

Tyle że trochę tego nie widzę... Czyli tablica dynamiczna dwuwymiarowa?
Powiem ze w temacie tablic to ja ciemny jestem. Jakoś tego zrozumieć nie zrobić.

0

bede taki mily i dam ci kod:

var
  tablica,losowe: array of integer;
  i,j,pom,maxwartosc:integer;

begin
     randomize;
     maxwartosc:=10; //tutaj możesz sobie ustawić ile ma być liczb xD
     Setlength(tablica,maxwartosc);
     Setlength(losowe,maxwartosc);
     for i:=0 to maxwartosc-1 do
          begin
          tablica[i]:=i+1;
          losowe[i]:=random(maxwartosc*3)+1;
          end;

     //sortowanie - tutaj użyłem bąbelkowego, które może być wolne przy dużych danych
     for i:=0 to maxwartosc-1 do
          for j:=i to maxwartosc-1 do
               if losowe[i]>losowe[j] then
               begin
               pom:=losowe[i];
               losowe[i]:=losowe[j];
               losowe[j]:=pom;

               pom:=tablica[i];
               tablica[i]:=tablica[j];
               tablica[j]:=pom;
               end;

    //wypisz tablice ;D
    for i:=0 to maxwartosc-1 do
          writeln(tablica[i]);

end.

Może być? ;-)

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