Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.92/180: Рейтинг темы: голосов - 180, средняя оценка - 4.92
0 / 0 / 0
Регистрация: 03.04.2012
Сообщений: 71

Моделирование случайных чисел с экспоненциальным законом распределения

03.04.2012, 00:11. Показов 37488. Ответов 27
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Программирования случайных чисел с экспоненциальным законом распределения. Товарищи помогите пожалуйста.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.04.2012, 00:11
Ответы с готовыми решениями:

Генерация случайных чисел с экспоненциальным законом распределения
Доброго времени суток, господа, нужна Ваша помощь в написании программы для генерации случайных чисел с экспоненциальным законом...

Сгенерировать последовательность 60 случайных чисел с экспоненциальным законом распределения с параметром
Сгенерировать последовательность 60 случайных чисел с экспоненциальным законом распределения с параметром =0,8. Упорядочить...

Как подобрать последовательность 100 случайных чисел с экспоненциальным законом на C++
Сгенерировать последовательность 100 случайных чисел с экспоненциальным законом =2. Вычислить среднее значение и дисперсию. распределения с...

27
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
03.04.2012, 00:52
Лучший ответ Сообщение было отмечено как решение

Решение

Логарифмическая функция распределения
F=1-exp(-lx)
Тебе нужна обратная ей функция. То есть по оси F откладываем случайные числа от 0 до 1 с равномерным распределением, а соответствующие им значения на оси x будут случайными, распределёнными по нужному нам закону.

Функция распределения F=1-exp(-lx)
Обратная ей будет x=ln(1-F)/(-l)
В итоге получаем
F=rand()/RAND_MAX;//нецелочисленное деление
x=ln(1-F)/(-l)
1-F распределена точно так же, как F, поэтому
x=ln(F)/-l=ln( rand()/RAND_MAX )/-l=( ln(rand()) - ln(RANDMAX))/(-l)

Итог:
C
1
2
3
4
#define LOFFSET ln(RAND_MAX)
double getLrand(double l){
   return (ln(rand()+1)-LOFFSET)/(-l);
}
3
0 / 0 / 0
Регистрация: 03.04.2012
Сообщений: 71
03.04.2012, 17:13  [ТС]
както слишком просто)

Добавлено через 4 минуты
Компилятор на всё ето говорит ерор
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
03.04.2012, 17:32
Ну наверное надо ещё добавить, какой еррор.
1
0 / 0 / 0
Регистрация: 03.04.2012
Сообщений: 71
03.04.2012, 17:36  [ТС]
1>c:\users\славiк\documents\visual studio 2010\projects\slavik15\slavik15\slavik15 .cpp(7): error C2601: getLrand: недопустимые локальные определения функций
1> c:\users\славiк\documents\visual studio 2010\projects\slavik15\slavik15\slavik15 .cpp(5): эта строка содержит "{", которая пока не имеет парной
1>c:\users\славiк\documents\visual studio 2010\projects\slavik15\slavik15\slavik15 .cpp(8): error C2065: RAND_MAX: необъявленный идентификатор
1>c:\users\славiк\documents\visual studio 2010\projects\slavik15\slavik15\slavik15 .cpp(8): error C3861: ln: идентификатор не найден
1>c:\users\славiк\documents\visual studio 2010\projects\slavik15\slavik15\slavik15 .cpp(8): error C3861: rand: идентификатор не найден
1>c:\users\славiк\documents\visual studio 2010\projects\slavik15\slavik15\slavik15 .cpp(8): error C3861: ln: идентификатор не найден

Добавлено через 1 минуту
И как ещо вывести на екран примерно 100 результатов?
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
03.04.2012, 18:16
Так ты это не тупо копируй в программу.
Я думал ты умеешь хоть что-то программировать.
Когда ты заговорил о числах с экспоненциальным законом распределения, я подумал: ну уж наверное он знает, что такое случайные числа и может написать в программе простейший генератор равномерно распределённых на интервале чисел.
А это оказывается твоя первая программа! Брось её и пиши Hello World! Приди к тому кто тебе дал задание и скажи "для меня это сложно, научи меня программировать сначала".
Ты хоть понимаешь, что если я напишу её целиком, у тебя умений от этого всё равно не прибавится?
Открой Шилдта или Страуструппа и читай!

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
//По теме: надо подключить библиотеки 
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
//Далее пишем наше изобретение
#define LOFFSET ln(RAND_MAX)
double getLrand(double l){
   return (ln(rand()+1)-LOFFSET)/(-l);
}
 
//Затем надо написать главную функцию!
int main(){
  // В главной функции выводишь на экран текст
  printf("Enter size of random sample:");//"введите размер выборки"
  int N;//в этой переменной будем хранить размер выборки
  scanf("%d", &N);//считываем с клавиатуры десятичное целое число и запоминаем его в переменной N
  printf("Enter lambda of distribution");//"Введите лямбду"
  double lambda;//это параметр твоего логарифмического распределения
  scanf("%f", &lambda);//считываем с клавиатуры десятичную дробь и запоминаем её в lambda
  //мы не будем даже массивов использовать или условий проверять - сразу выводим выборку
 //правда для генерации псевдослучайных чисел надо сначало задать seed
  srand ( time(NULL) );
//Итак: цикл вывода
  while (N>0) {//начало цикла. повторения будут происходить пока оставшееся число повторений не 
                  //дойдёт до 0
       printf("%f ", getLrand(lambda));//генерируем элемент выборки и тут же выводим
       N=N-1;//цикл подходит к концу, нам его осталось повторять на один раз меньше, поэтому N-1
   }             ///конец цикла, повторяем всё с места, обозначенного "начало цикла"
 
  getch();//в конце работы программа останавливается и ждёт ввода с клавиатуры, чтобы
 //ты увидел результат перед выходом из программы
  return 0;//возврат  из программы.
}
3
0 / 0 / 0
Регистрация: 03.04.2012
Сообщений: 71
03.04.2012, 18:29  [ТС]
Очень болшое спасибо. Я уже умею немного, просто с генератором перый раз столкнулся.
0
 Аватар для alexey31415
60 / 60 / 7
Регистрация: 16.05.2010
Сообщений: 632
03.04.2012, 18:57
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
#define LOFFSET ln(RAND_MAX)
double getLrand(double l){
* *return (ln(rand()+1)-LOFFSET)/(-l)
RAND_MAX - это символическая константа или определяемое нами число?а то не сталкивался с RAND_MAX прежде
0
0 / 0 / 0
Регистрация: 03.04.2012
Сообщений: 71
03.04.2012, 19:56  [ТС]
а ln ето логарифм натуральный? А то мне ошыбку выдает
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
03.04.2012, 20:01
Цитата Сообщение от alexey31415 Посмотреть сообщение
RAND_MAX - это символическая константа или определяемое нами число?а то не сталкивался с RAND_MAX прежде
из stdlib оттуда же, откуда и rand

Добавлено через 3 минуты
Цитата Сообщение от slavikg Посмотреть сообщение
а ln ето логарифм натуральный? А то мне ошыбку выдает
Нет такой функции ln, надо писать log вместо ln. Это уж я лоханулся.
2
0 / 0 / 0
Регистрация: 03.04.2012
Сообщений: 71
03.04.2012, 20:09  [ТС]
если я делаю замену на log то мне выбивает
1>c:\users\славiк\documents\visual studio 2010\projects\slavi16\slavi16\slavik16.c pp(7): error C2668: log: неоднозначный вызов перегруженной функции
1> e:\program files (x86)\microsoft visual studio 10.0\vc\include\math.h(575): может быть "long double log(long double)"
1> e:\program files (x86)\microsoft visual studio 10.0\vc\include\math.h(527): или "float log(float)"
1> e:\program files (x86)\microsoft visual studio 10.0\vc\include\math.h(120): или "double log(double)"
1> при попытке сопоставить список аргументов "(int)"
1>c:\users\славiк\documents\visual studio 2010\projects\slavi16\slavi16\slavik16.c pp(7): error C2668: log: неоднозначный вызов перегруженной функции
1> e:\program files (x86)\microsoft visual studio 10.0\vc\include\math.h(575): может быть "long double log(long double)"
1> e:\program files (x86)\microsoft visual studio 10.0\vc\include\math.h(527): или "float log(float)"
1> e:\program files (x86)\microsoft visual studio 10.0\vc\include\math.h(120): или "double log(double)"
1> при попытке сопоставить список аргументов "(int)"
1>c:\users\славiк\documents\visual studio 2010\projects\slavi16\slavi16\slavik16.c pp(13): error C3861: printf: идентификатор не найден
1>c:\users\славiк\documents\visual studio 2010\projects\slavi16\slavi16\slavik16.c pp(15): error C3861: scanf: идентификатор не найден
1>c:\users\славiк\documents\visual studio 2010\projects\slavi16\slavi16\slavik16.c pp(16): error C3861: printf: идентификатор не найден
1>c:\users\славiк\documents\visual studio 2010\projects\slavi16\slavi16\slavik16.c pp(18): error C3861: scanf: идентификатор не найден
1>c:\users\славiк\documents\visual studio 2010\projects\slavi16\slavi16\slavik16.c pp(21): warning C4244: аргумент: преобразование "time_t" в "unsigned int", возможна потеря данных
1>c:\users\славiк\documents\visual studio 2010\projects\slavi16\slavi16\slavik16.c pp(25): error C3861: printf: идентификатор не найден
1>c:\users\славiк\documents\visual studio 2010\projects\slavi16\slavi16\slavik16.c pp(29): error C3861: getch: идентификатор не найден
0
601 / 569 / 104
Регистрация: 07.11.2010
Сообщений: 2,004
03.04.2012, 20:14
так надо подключить библиотеки
stdio.h
conio.h
math.h
0
0 / 0 / 0
Регистрация: 03.04.2012
Сообщений: 71
03.04.2012, 20:19  [ТС]
подключены
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
04.04.2012, 00:18
Вот такой вариант однозначно работает
C++
1
2
3
4
#define LOFFSET log((float)RAND_MAX)
float getLrand(float l){
  return (log(rand()+1.0)-LOFFSET)/(-l);
}
Поставил float перед RAND_MAX. Вообще дефайны, макросы такая тема, в которых я ошибки ищу в последнюю очередь. Ведь компилятор ругается на совершенно другую строчку. А зря, иногда очень неочевидные вещи происходят.
1
347 / 292 / 37
Регистрация: 23.03.2012
Сообщений: 838
04.04.2012, 00:50
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Вот такой вариант однозначно работает
C++
1
2
3
4
#define LOFFSET log((float)RAND_MAX)
float getLrand(float l){
  return (log(rand()+1.0)-LOFFSET)/(-l);
}
Зачем несколько раз логарифм брать?
C++
1
-1.0/lambda+log(rand()*1.0/RAND_MAX);
2
0 / 0 / 0
Регистрация: 03.04.2012
Сообщений: 71
04.04.2012, 16:00  [ТС]
А почему мне всегда видает результат -0,0000 ?
0
347 / 292 / 37
Регистрация: 23.03.2012
Сообщений: 838
04.04.2012, 16:36
Цитата Сообщение от slavikg Посмотреть сообщение
А почему мне всегда видает результат -0,0000 ?
потому что для double надо в считывании\вводе писать "%lf", а не "%f"
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
 
double getLrand(double l)
{
 return -log((double)(rand())/RAND_MAX)/l;
}
 
int main()
{
 printf("Enter size of random sample:");
 int N;
 scanf("%d", &N);
 printf("Enter lambda of distribution");
 double lambda;
 scanf("%lf", &lambda);
 srand ( time(NULL) );
 while (N>0) 
 {
  printf("%lf ", getLrand(lambda));
  N=N-1;
 }             
 getch();
 return 0;
}
2
 Аватар для alexey31415
60 / 60 / 7
Регистрация: 16.05.2010
Сообщений: 632
04.04.2012, 19:36
Цитата Сообщение от Nekto Посмотреть сообщение
(float)RAND_MAX
а разве и так можно привести переменную к типу float?
0
0 / 0 / 0
Регистрация: 03.04.2012
Сообщений: 71
04.04.2012, 21:35  [ТС]
а какой вариант правилный тот который ты дал или тамтой что выше ? Ато результати разные
0
347 / 292 / 37
Регистрация: 23.03.2012
Сообщений: 838
04.04.2012, 21:36
Цитата Сообщение от slavikg Посмотреть сообщение
а какой вариант правилный тот который ты дал или тамтой что выше ? Ато результати разные
последний. В том я формулу не ту задал.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.04.2012, 21:36
Помогаю со студенческими работами здесь

получения случайных чисел с заданным законом распределения
Разработать алгоритм, реализующий соответствующий метод получения случайных чисел с заданным законом распределения. Метод кусочной...

Моделирование случайной величины с заданным законом распределения
нужна программка на с++ сгенерировать x по заданным законам распределения помогите пожалуйста!

Генерация случайных величин с заданным законом распределения
генерация случайных величин с заданным законом распределения. Нужен код для программы . Заранее спасибо за помощь) Добавлено через 3...

Моделирование случайной величины с экспоненциальным законом распределения методом обратной функции
Здраствуйте! Помогите пожалуйста, надо смоделировать случайную величину с экспоненциальным законом распределения методом обратной функции.

Как подобрать последовательность 100 случайных чисел с экспоненциальным законом
Сгенерировать последовательность 100 случайных чисел с экспоненциальным законом =2. Вычислить среднее значение и дисперсию. распределения с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru