Losowe mieszanie tablicy

Odpowiedz Nowy wątek
2011-08-01 13:57
Macio
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 :( ?

Pozostało 580 znaków

2011-08-01 19:55
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

edytowany 1x, ostatnio: absent, 2011-08-01 20:00

Pozostało 580 znaków

2011-08-01 20:03
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.

Pozostało 580 znaków

2011-08-02 13:39
Macio
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 :/

Pozostało 580 znaków

2011-08-02 17:09
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;

Pozostało 580 znaków

2011-08-02 17:53
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.

edytowany 1x, ostatnio: Azarien, 2011-08-02 17:55
A faktycznie - tak też można. A przy okazji przypomniałeś mi taki "myk". - olesio 2011-08-02 18:05

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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