algorytm.org

Implementacja w C/C++



Baza Wiedzy
wersja offline serwisu przeznaczona na urządzenia z systemem Android
Darowizny
darowiznaWspomóż rozwój serwisu
Nagłówki RSS
Artykuły
Implementacje
Komentarze
Forum
Bookmarki






Sonda
Implementacji w jakim języku programowania poszukujesz?

Generator LCG (Liniowy Generator Kongruentny) - Implementacja w C/C++
Ocena użytkownikóww: *****  / 6
SłabyŚwietny
Nadesłany przez Tomasz Lubiński, 13 września 2008 01:00
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.
Pobierz pełne rozwiązanie.

Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.

Generator LCG - C++/lcg.c:
//generowanie liczb pseudolosowych
//generator LCG
//www.algorytm.org (c) 2008 Tomasz Lubinski

#include "stdio.h"

unsigned long long m;
unsigned long long a;
unsigned long long c;
unsigned long long x;

// Calculate a*x mod m
unsigned long long mult(unsigned long long a, unsigned long long  x, unsigned long long m)
{
   unsigned long long b,n,r;

   r = 0;
   n = 1;
   b = 1;
   while (n <= 64)
   {
      if ((a & b) != 0)
         r = (r + x) % m;
      x = (x + x) % m;
      b *= 2;
      n++;
   }

   return r;
}

unsigned long long genRand()
{
   x = (mult(a,x,m) + c) % m;
   return x;
}

int main()
{
   int i, n;
   unsigned long long low, high;

   printf("Podaj wspolczynnik m\n");
   scanf("%Ld", &m);

   printf("Podaj wspolczynnik a\n");
   scanf("%Ld", &a);

   printf("Podaj wspolczynnik c\n");
   scanf("%Ld", &c);

   printf("Podaj wartosc ziarna x[1]\n");
   scanf("%Ld", &x);

   printf("Podaj ile liczb pseudolosowych wylosowac\n");
   scanf("%d", &n);

   printf("Podaj dolna wartosc zakresu generowanych liczb\n");
   scanf("%Ld", &low);

   printf("Podaj gorna wartosc zakresu generowanych liczb\n");
   scanf("%Ld", &high);

   for (i=0; i<n; i++)
   {
      printf("%Ld\n", low + (genRand() % (high - low + 1)));
   }

   return 0;
}
Dodaj komentarz