Program ma takie dwa fragmenty:
int m=(int)C(rozmiar*rozmiar,rozmiar); //symbol Newtona (=19 477 92)
for(int i=0;i<testy;i++)
{
losuj3(m);
}
Zmienne rozmiar i testy wpisuje użytkownik (tzn. ja). Wpisywałem rozmiar = 6, oraz testy rzędu kilka tysięcy.
private void losuj3(int m)
{
liczby=new int[rozmiar][rozmiar];
int[] temp=new int[rozmiar*rozmiar];
long l=1+losowacz3.nextInt(m);
//l=10626L; //ignoruję wynik losowania, liczę dla liczby, która poprzednio generowała błąd.
long s=0;
int n=rozmiar*rozmiar-1;
int k=rozmiar-1;
long poprzednia=0;
for(int i=0;i<rozmiar;i++)
{
int liczba=0;
while(s<l)
{
poprzednia=s;
s+=C(n,k);
n--;
}
liczba=rozmiar*rozmiar-n-1;
temp[liczba-1]=1;
l-=poprzednia;
n=rozmiar*rozmiar-liczba-1;
s=0;
poprzednia=0;
k--;
}
}
Dla niezorientowanych: funkcja losuj3() losuje liczbę l z zakresu 1 - C(36,6), a następnie ustala jaki 6-elementowy podzbiór zbioru {1,2,...,36) znajduje się na pozycji l w uporządkowaniu leksykograficznym.
Dla dużych wartości zmiennej testy dla kilku spośród wylosowanych liczb wyniki są absurdalne. Hipoteza, że algorytm jest niepoprawny i dla tych liczb daje złe wyniki jest nieprawdziwa. Jeżeli po błędnym przebiegu zmienię program, zignoruję wynik losowania i liczę dla liczb generujących poprzednio błąd, to wyniki są prawidłowe.
Widzi ktoś błąd?