ja robilem to troszke inaczej.... losowalem n-ty element :) . powiedzmy mamy tablice 4 elementowa . wiec pola odpowiednio sa indeksowane od 0..3. losowalem wiec liczbe z tego wlasnie zakresu i... zaznaczalem wylosowane pole jako zajete. przy nastepnym przejsciu pozostalo mi jez 4-1 =3 mozliwosci losowania, wiec odpowiednio zakres zmniejszal sie do 0..2 . wylosowalemi teraz znow zaznaczylem n-te nie zajete pole jako wylosowane... wynikiem losowania nie byla bezposrednio wartosc zwrocona przez rand(), tylko wartosc wtorna - indeks n-tego wolnego pola.
ta metoda ma ta zalete, ze wartosci w tablicy maja znaczenie tylko 0/1 (wylosowane/niewylosowane), a wiec mozna w kazdym bajcie pamieci zmiescic 8 komorek (ale to sobie ew. sam dopiszesz :) )
char tab[]={1,1,1,1}; // char tab[]={0,0,0,0};
int wolne=4;
int losuj(){
if(!wolne)return -1;
int i=1+(rand()%wolne);
int j=0;
while(i)i-=tab[j++]; // while(i)i-=!tab[j++];
tab[--j]=0; // tab[--j]=1;
return j;
}