Hi,
Jak stworzyć generator liczb losowych, w którym wylosowane liczby nidy nie będą się powtarzać [glowa] ???
Hmmm... w c++?
- Przeczytaj topic o Powiększaniu tablicy dynamicznej
- random();
- jeśli dana z punktu 2. już się znajduje w twojej tablicy to wróć do punktu 2.
- dodaj wartość do tablicy i oddaj ją na wyjście
Albo też idąc od tyłu... Jeżeli masz zakres, z którego losujesz i jest to typ skokowy (stałoprzecinkowy), to możesz stworzyć tablicę w której przeznaczysz na każdą wartość jeden bit, czy nawet bajt jesli zalezy ci na szybkości, nie objętości. Od razu na cały zakres bez realokacji i zmiany wymiaru. W końcowym etapie i tak zajmiesz tyle samo pamięci, a będzie szybciej, bo nie będzie straty czasu na realloc. No i na dzień dobry tablica musi być cała wyzerowana. Tylko... min. wielkość tablicy= rozmiar zakresu (rozmiar zakresu/8)... Więc tez są ograniczenia w zastosowaniu.
Mozna jeszcze zagmatwać i zrobic generator pseudolosowy, bez powtarzania. Po prostu...
#define zakres 10
main(){
typedef unsigned char uchar;
uchar* tab=new uchar[zakres]; // <-
int i=zakres; // <-
int j;
int wolne=zakres;
randomize();
while(i--)tab[i]=0; // while(i)tab[--i]=0;
do{
i=random(wolne--)+1;
j=zakres;
do{
i-=(!tab[--j]); // <-
}while(i);
tab[j]=1; // <-
// Tu j ma wortość, której potrzebujesz ...
robie_swoja_funkcję(j); // j- wartosc randomowa.
// tu i, j do dowolnego wykorzystania. ich wartości już nie rzutują
}while(wolne);
}
Łapiesz? Taka samozaciskająca się pętla. Bez powtórzeń.
Dla tablicy bitowej (symulacja pascalowego set'a) musisz poprawić linie oznaczone <- na :
uchar* tab=new uchar[(zakres+7)/8]; // zookrąglenie w górę.
int i=(zakres+7)/8; // i tu
--j; // lub j-- ; tu nie znam kolejności wywołań, więc wywalam j na zewnątrz
i-=(!((tab[j/8]>>(j%8))&1)); // sprawdzanie bitu.
tab[j/8]|=1<<(j%8); // | - or, |= ... - operacje na bitach
Chodzi o to, żeby nie losować samej liczby, tylko... i-tą nie wykorzystaną liczbę. Tu akurat i-ta od tyłu, ale nic nie stoi na przeszkodzie, by iść od dołu tablicy- to tylko kwestia przypisania j=-1 i zmiany --j na ++j .