[C++ na C] liczby pseudolosowe


(Grzenioczaja) #1

Cześć mam mały programik do zrobienia na zajęcia i znalazłem gotową wersję w C++ jednak mam problem z przekładem na C

Mam nadzieję że ktoś pomoże choć w części i wytknie błędy

Oryginał

#include 

#include 

#include 

#include 

#include 


using namespace std;


typedef unsigned long long ulong;


ulong NWD(ulong a, ulong b)

{

  ulong t;


  while(b)

  {

    t = b; b = a % b; a = t;

  }

  return a;

}


int main()

{

  ulong m,a,c,x,d,g;


  srand((unsigned)time(NULL));

  cin >> x;

  m = x + 1;

  do c = rand() % m; while(NWD(m,c) != 1);

  a = 1; x = m; d = 2; g = (ulong)sqrt(m);

  while(d <= g)

  {

    if(x % d == 0)

    {

      a *= d;

      do x /= d; while(x % d == 0);

    }

    if(d == 2) d++; else d += 2;

    if(x < d) break;

  }

  a *= x;

  if(m % 4 == 0) a <<= 1;

  a++;

  cout << "m = " << setw(12) << m << endl

       << "a = " << setw(12) << a << endl

       << "c = " << setw(12) << c << endl

       << endl;

  return 0;

}

moja przeróbka niedziałająca

#include 

#include 

#include 

#include 


typedef unsigned long long ulong;                  


ulong NWD(ulong a, ulong b)

{

  ulong t;


  while(b != 0)                                            

  {

    t = b; 

    b = a % b; 

    a = t;

  }

  return a;

}

int main()

{

  int m,a,c,x,d,g,x0;

    srand((int)time(0));

  scanf ("%i\n", x);

  scanf ("%i\n", x0);

  m = x + 1;

      do 

  c = rand() % m; 

  while(NWD(m,c) != 1);

  a = 1; x = m; d = 2; g = (ulong)sqrt(m);

    while(d <= g)

  {

    if(x % d == 0)

    {

      a *= d;

      do x /= d; 

      while(x % d == 0);

    }

    if(d == 2) d++; else d += 2;

    if(x < d) break;

  }

     a *= x;

   if(m % 4 == 0) 

  a <<= 1;

    a++; 

    printf ("m= " "%i\n", m);       

  printf ("a= " "%i\n", a);

  printf ("c= " "%i\n", c);   

  system("PAUSE");	

  return 0;

}

Oryginał i opis działania pochodzi ze http://edu.i-lo.tarnow.pl/inf/alg/001_search/0019.php i jest to program wyliczający współczynniki addytywnego generatora LCG na podstawie maksymalnej liczby pseudolosowe Xmax

Z góry dzięki :smiley:


(Sawyer47) #2

I z czym masz problem? Poza tym, że scanf przyjmuje wskaźniki na int, a nie int (linia 25 i 26).

Tak na marginesie, czemu drugi kod nie wygląda tak jak pierwszy pod względem formatowania? Aż nie chce mi się wierzyć, że podczas przepisywania kodu można aż tak zepsuć czytelność...


(Grzenioczaja) #3

Problem jest prosty - nie znam się na języku C ani na C++ a to co przepisałem jest efektem tego co przeczytałem na internecie :frowning: .

Co do podpowiedzi poprawy to nie rozumiem jej - wybacz. Czy mogę prosić o napisanie poprawnej składni? Nadal program mi się wysypuje?


(Sawyer47) #4

W działanie kodu się nie zgłębiałem, jedyne co widać od razu to

scanf ("%i\n", x);

\scanf ("%i\n", x0);

scanf przyjmuje wskaźnik, więc trzeba użyć operatora &, który daje wskaźnik obiektu

scanf ("%i\n", &x);

  scanf ("%i\n", &x0);

(Grzenioczaja) #5

Dzięki 'scanf' działa ok tylko zamiast pobierać 2 liczby konsolka prosi o 3, ta nadprogramowa liczna nie wpływa na wynik, ale jednak nie wiem skąd to żądanie?


(Sawyer47) #6

W scanf daj "%i", bez żądania nowej linii po liczbie - stąd to pozorna prośba o 3 liczbę - tak naprawdę czeka na znak nowej linii (o ile dobrze pamiętam działanie scanf).


(Grzenioczaja) #7

Sawyer Bardzo dziękuję za pomoc. Zawsze miałem problem z kruczkami :slight_smile:

Gdyby ktoś potrzebował generatora liczb pseudolosowych w C połączonym z programem wyliczającym współczynniki addytywnego generatora LCG na podstawie maksymalnej liczby pseudolosowej Xmax i ziarna Xo to podaję mój efekt:

#include 

#include 

#include 


/* podstawowy algorytm liczący Xn = (a × Xn-1 + c) mod m 


 Xn - n-ta liczba pseudolosowa

Xn-1 - poprzednia liczba pseudolosowa

a - mnożnik

c - przyrost

m - moduł  

*/              


int NWD(int a, int b)

{

  int t;


  while(b != 0)                                            

  {

    t = b; 

    b = a % b; 

    a = t;

  }

  return a;

}

int main()

{

  int m,a,c,x,d,g,x0;


  printf ("Podaj wartosc maksymalnej liczby pseudolosowej Xmax""\n");

  scanf ("%i", &x);

  printf ("Podaj poczatkowa wartosc ziarna X0""\n");

  scanf ("%i", &x0);


  m = x + 1;

  do c = rand() % m; while(NWD(m,c) != 1);

  a = 1; x = m; d = 2; g = (int)sqrt(m);

  while(d <= g)

  {

    if(x % d == 0)

    {

      a *= d;

      do x /= d; while(x % d == 0);

    }

    if(d == 2) d++; 

    else d += 2;

    if(x < d) break;

  }

  a *= x;

  if(m % 2 == 0) a <= 1;

  a++;

  printf ("0liczone wspolczynniki: ""\n");

  printf ("modul m= " "%i\n", m);       

  printf ("mnoznik a= " "%i\n", a);

  printf ("przyrost c= " "%i\n", c);       


 printf ("0bliczone liczby pseudolosowe: ""\n");    

     x = x0; 

 do

  {

    x = (a * x + c) % m;

    printf (" "" %i\n", x);   

  }

   while(x != x0);  


       system("PAUSE");

  return 0;

}