Уважаемые.... посмотрите пожалуйста.... кусок кода... Код (Text): #include <stdio.h> #include <stdlib.h> #include <stddef.h> #include <errno.h> #include <string.h> #include <math.h> typedef unsigned long ulong; typedef unsigned int uint; typedef struct { const char * P_Name; uint Max; uint Min; size_t Size; void (* P_Set) (void * P_State, uint Seed); uint (* P_Get) (void * P_State); double (* P_GetDouble) (void * P_State); } RngType; typedef struct { const RngType * P_Type; void * P_State; } Rng; ...... Код (Text): int main() { double k = 0, mu = 9000; int i = 0, n = 10, ok = 1; const RngType * p_type = 0; Rng * p_rng = 0; RandNumbGen generator; uint max_gen, min_gen; RngEnvSetup(); p_type = RngDefault; p_rng = RngAlloc(p_type); max_gen = p_rng->P_Type->Max; min_gen = p_rng->P_Type->Min; for (i = 0; i < n; i++) { k = generator.RanExponential(p_rng, mu); printf("%u \n", k); } printf("min_gen = %u \n", min_gen); printf("max_gen = %u \n", max_gen); return ok; } так все работает, все генерируется... но есть одно но! мне надо каким-то образом вот эти p_rng->P_Type->Max и p_rng->P_Type->Min (то бишь максимум и минимум генератора) задать вручную.... если делать так Код (Text): uint max_gen, min_gen; .... p_rng->P_Type->Max = max_gen; p_rng->P_Type->Min = min_gen; и переменным max_gen, min_gen присвоить какое-либо значение хоть жестко в программе, хоть вводя с коммандной строки, все равно, компилятор ругаетс... выдает ошибку.... cannot modify a const object
Код (Text): /* Получаем текущие максимальное и минимальное значения */ max_gen = p_rng->P_Type->Max; min_gen = p_rng->P_Type->Min; new_max_gen = 100; /* Пример нового максимального значения */ new_min_gen = 3; /* Пример нового минимального значения */ max_gen -= min_gen; new_max_gen -= new_min_gen; /* Генерируем случайное число */ k = generator.RanExponential(p_rng, mu); /* Подстраиваем под новый диапазон */ k -= min_gen; k = (uint)(((double)k) * new_max_gen / max_gen); k += new_min_gen; Лучше, конечно, разобрать исходники генератора, чтобы можно было изменять Max и Min.
Quantum Вариант, который вы предложили не работает... все к получаются равными нулю. Давайте попробуем разобраться в исходниках генератора. Суть вот в чем. Код (Text): // установка генератора //Descr: эта функция считывает переменные окружения RNG_TYPE (имя генератора, // по умолчанию mt19937) и RNG_SEED (начальное число генератора, по умолчанию 0) // и использует из значения для установки соответствующей библиотеки переменных. RngEnvSetup(); //Desr: тип устанавливаемого генератор апо умолчанию p_type = RngDefault; //Descr: эта фукция возвращает указатель на новосозданный генератор случайных чисел. // Генератор автоматически запускается со значения начального числа по умолчанию // (равно 0) p_rng = RngAlloc(p_type); //Descr: эта функция возвращает случайные величины по экспоненциональному // распределению со средним значением mu. k = generator.Exponential(p_rng, mu); ниже описаны функции, используемые выше. Код (Text): const RngType * RngEnvSetup() { uint seed = 0; const char *p = getenv("RNG_TYPE"); if (!p) { RngDefault = Rng_Mt_19937; } p = getenv ("RNG_SEED"); if (p) { seed = strtoul (p, 0, 0); /*fprintf (stderr, "RNG_SEED=%lu\n", seed);*/ }; RngDefaultSeed = seed; return RngDefault; } static const RngType MtType = { "Mt_19937", //name 0xffffffffUL, //RAND_MAX 0, //RAND_MIN sizeof (MtStateT), &MtSet, &MtGet, &MtGetDouble }; const RngType * RngDefault = &MtType; uint RngDefaultSeed = 0; void RngSet (const Rng * pR, uint seed) {(pR->P_Type->P_Set) (pR->P_State, seed);} Rng * RngAlloc (const RngType * pT) { Rng * pR = (Rng *) malloc (sizeof (Rng)); /*if (pR == 0) { ERROR_VAL ("failed to allocate space for rng struct", ENOMEM, 0); };*/ pR->P_State = malloc (pT->Size); if (pR->P_State == 0) { free (pR); //exception in constructor, avoid memory leak /*ERROR_VAL ("failed to allocate space for rng state", ENOMEM, 0);*/ }; pR->P_Type = pT; RngSet (pR, RngDefaultSeed); //seed the generator return pR; } double RandNumbGen::Exponential(const Rng * P_r, const double mu) { double u = RngUniformPos(P_r); return -mu * log(u); } вот надо как-то задать мининимум и максимум для генерируемых значений. учитывая, что Код (Text): typedef struct { const char * P_Name; uint Max; uint Min; size_t Size; void (* P_Set) (void * P_State, uint Seed); uint (* P_Get) (void * P_State); double (* P_GetDouble) (void * P_State); } RngType; typedef struct { const RngType * P_Type; void * P_State; } Rng; VAR const RngType * Rng_Mt_19937;
turistti new_max_gen и/или max_gen в предпоследней строчке тоже нужно к double приводить. Иначе компилятор задействует целочисленное деление.