Losowe mieszanie tablicy

0

Hej. Mam tablicę, a dokładnie to dwuwymiarową:

Tablica : array[0..399, 0..6] of String;

Chciałbym zupełnie losowo pomieszać tą tablicę, ale nie mieszając tych 6 elementów miedzy sobą. Tak by np. numer 205 razem z elementami przeniosło na miejsce 3, a i tak samo z innymi (losowo). Dla przykładu powiedzmy, że mam zwierzęta z gatunkami. na miejscu 35 jest żaba i jej 6 gatunków, no to chcę tą żabę przenieść w losowe miejsce np. 200 gdzie jest motyl, i tego motyla znowu w inne miejsce i tak aż wszystkie zmiesza. To wykonalne?

Wiem że będę musiał użyć randomize ale na tym kończą się moje pomysły, nie wiem jak tu zachować pełne losowanie wszystkich by najlepiej nikt nie pozostał na starym miejscu.

Pozdrawiam :)

Naprawdę nikt nie wie :( ?

0

Spójrz na ostatni post wątku poruszonego na tym forum: http://forum.p-zone.pl/losowanie-6-z-49-vt19518.html, może ci w czymś to pomoże

0

Zamiana typu "6 elementów na raz" jest B'ANALNA:

var Tablica : array[0..399, 0..6] of String;

var element:array[0..6] of string;

begin
  element:=tablica[100];
  tablica[100]:=tablica[200];
  tablica[200]:=element;
end.

problem sprowadza się więc do mieszania zwykłej tablicy (jednowymiarowej), a ten do tzw. "losowania bez powtórzeń" (dla każdego istniejącego indeksu od 0 do 399 losujesz bez powtórzeń nowy indeks w tym samym przedziale).
Losowanie bez powtórzeń było poruszane na forum wielokrotnie.

0

niestety

element:=tablica[100];

powoduje u mnie błąd [DCC Error] Unit2.pas(629): E2008 Incompatible types, nie rozumiem dlaczego skoro i jedno i drugie to tablica :/

0

@macio: błąd jest dlatego, że jak napisał kompilator typy są niekompatybilne. Azarien chyba więcej pisze w C/C++ i może tam takie coś jest możliwe (nie wiem, bo ja pisze tylko w Delphi). Chyba, że w Delphi jest to w nowszych wersjach niż Delphi 7 możliwe albo przy jakiejś dyrektywie kompilatora. Także trzeba zrobić raczej tak:

var
  I : Byte;
  Element : array[0..6] of string;
  Tablica : array[0..399, 0..6] of string;
begin
  for I := Low(Element) to High(Element) do
    Element[I] := Tablica[100][I];
  Tablica[100] := Tablica[200];
  for I := Low(Element) to High(Element) do
    Tablica[200][I] := Element[I];
end;
0

użyłem FreePascala. jeśli to się pod Delphi nie kompiluje, to trzeba stworzyć osobny typ:

type TElementTablicy = array[0..6] of string;

var Tablica : array[0..399] of TElementTablicy;
 
var element:TElementTablicy;
 
begin
  element:=tablica[100];
  tablica[100]:=tablica[200];
  tablica[200]:=element;
end.

binarna reprezentacja obu tablic będzie identyczna.

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