Liczby losowe

0

Hi,
Jak stworzyć generator liczb losowych, w którym wylosowane liczby nidy nie będą się powtarzać [glowa] ???

0

Hmmm... w c++?

  1. Przeczytaj topic o Powiększaniu tablicy dynamicznej
  2. random();
  3. jeśli dana z punktu 2. już się znajduje w twojej tablicy to wróć do punktu 2.
  4. dodaj wartość do tablicy i oddaj ją na wyjście
0

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 .

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