Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.04.2011, 10:32   #11
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Цитата:
Сообщение от Сtrl Посмотреть сообщение
Давайте посмотрим в задание автора:
Давайте.

Вот Вам ТЗ:

Написать датчик случайных чисел, генерирующий случайную величину, являющуюся натуральным числом из диапазона [1,6], вероятности появления которой определяются так:
1 - 0,08
2 - 0,08
3 - 0,32
4 - 0,32
5 - 0,10
6 - 0,10

Я, как видите, сократил количество интервалов до трёх, оставив в каждом интервале по 2 равновероятных значения, но суть задачи - сохранил. С громадным интересом посмотрю на Ваш код! Естественно, ничего против использования внутри него ф-ии rand() не имею.
Vago вне форума Ответить с цитированием
Старый 10.04.2011, 11:44   #12
EC.cpp
Пользователь
 
Регистрация: 09.04.2011
Сообщений: 30
По умолчанию

Цитата:
Сообщение от Vago Посмотреть сообщение
Давайте.

Вот Вам ТЗ:

Написать датчик случайных чисел, генерирующий случайную величину, являющуюся натуральным числом из диапазона [1,6], вероятности появления которой определяются так:
1 - 0,08
2 - 0,08
3 - 0,32
4 - 0,32
5 - 0,10
6 - 0,10

Я, как видите, сократил количество интервалов до трёх, оставив в каждом интервале по 2 равновероятных значения, но суть задачи - сохранил. С громадным интересом посмотрю на Ваш код! Естественно, ничего против использования внутри него ф-ии rand() не имею.
Ну собственно на первый взгляд ничего трудного нет.
Попробую кратко описать: из исходных вероятностей нам надо сделать 100 бросков чтобы получить соответствующие распределения значений, т.е. известно заранее что после 100 бросков: в 8 случаях выпадет 1, в 32 случаях выпадет 3 и т.д.

//Надо описать структуру для хранения данных:
Код:
struct Card
{
	unsigned int value;		//Ценность элемента, в данном случае принимает значение от 1-6
	Card* next;			//Указатель на след элемент, односвязныый список
}
//Описать методы реализующие стандартную работу с односвязным списком:
Код:
discInfo* add_elem (...);	//Функция добавления элемента списка
void show_elem ();			//Процедура вывода одного элемента списка на консоль
void shake_me_up(...);		//Процедура случайного перемешивания списка
Последняя процедура самая интересная, в ней то и будем смешивать нашу "Колоду" чисел от 1-6. Алгоритм может выглядеть приблизительно так:
Код:
	unsigned int Unsort_cards = 100;	//Текущее количество неперемешанных карт
	unsigned int i;						//Просто счетчик
	unsigned int rnd;					//Случайная величина, указывающая на номер смешиваемой в текущий момент карты
	Card* Base;							//Заголовок списка

	for (i=99; i > -1; i--)
	{
		rnd = rand() %i;				//Получаем номер перемещаемого в конец списка элемента структуры
		{...}							//Обработка списка относительно смещенной карты(величины)
	}

	ShowList();							//Показать уже смешанную колоду чисел с заданными вероятностями выпадения

Последний раз редактировалось EC.cpp; 10.04.2011 в 13:02.
EC.cpp вне форума Ответить с цитированием
Старый 10.04.2011, 12:07   #13
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Уважаемый (? ) EC.cpp! Повторяю, я буду дико благодарен, если увижу здесь код. Не "на первый взгляд", не "приблизительно", не обрывки, а полнофункциональный КОД, обеспечивающий то задание, которое я в #11 написал! Чтобы я вызвал Ваш датчик тыщу раз, построил гистограммку, увидел три ступеньки, удовлетворённо хмыкнул и сказал бы себе "О! С этим парнем (? ) можно поговорить дальше!.."

И ещё. Одним из требований, с необходимостью предъявляемых к Д(П)СЧ, является быстродействие. Ибо в реальных задачах моделирования этот датчик вызывается миллиарды и миллиарды раз. Поэтому использовать в ПО этого типа связанные списки - ну, как бы это помягче выразиться... непрофессионально. Впрочем, ладно. Я готов посмотреть на код, использующий внутри любые структуры данных, лишь бы он соответствовал моему ТЗ.

Заранее спасибо.
Vago вне форума Ответить с цитированием
Старый 10.04.2011, 12:16   #14
EC.cpp
Пользователь
 
Регистрация: 09.04.2011
Сообщений: 30
По умолчанию

Цитата:
Сообщение от Vago Посмотреть сообщение
... а полнофункциональный КОД, обеспечивающий то задание, которое я в #11 написал! ...
Хм, знаете вот что было плохо в Советском Союзе? :-)
Говорят - отсутствие стимула.
Так вот собственно чтобы качественно реализовать и оттестировать это в коде мне понадобится около дня - зачем мне этим заниматься?
Я Вам предоставил алгоритм - ответ на вопрос КАК.
А реализовывать это в коде любого языка программирования - работа программиста

Цитата:
Сообщение от Vago Посмотреть сообщение
И ещё. Одним из требований, с необходимостью предъявляемых к Д(П)СЧ, является быстродействие. Ибо в реальных задачах моделирования этот датчик вызывается миллиарды и миллиарды раз. Поэтому использовать в ПО этого типа связанные списки - ну, как бы это помягче выразиться... непрофессионально. Впрочем, ладно. Я готов посмотреть на код, использующий внутри любые структуры данных, лишь бы он соответствовал моему ТЗ.

Заранее спасибо.
Списки - один и самых эффективных и быстрых методов для реализации задач подобного типа. Если Вы знаете ( знаете? :-) ) какие-либо другие, поделитесь пожалуйста с окружающими.
EC.cpp вне форума Ответить с цитированием
Старый 10.04.2011, 12:26   #15
Сtrl
C++
Форумчанин
 
Аватар для Сtrl
 
Регистрация: 27.03.2011
Сообщений: 803
По умолчанию

Цитата:
Вот Вам ТЗ:

Написать датчик случайных чисел, генерирующий случайную величину, являющуюся натуральным числом из диапазона [1,6], вероятности появления которой определяются так:
1 - 0,08
2 - 0,08
3 - 0,32
4 - 0,32
5 - 0,10
6 - 0,10
Код:
int getrand(void)
{
	if (!(rand()%5)) //события выполняются с вероятностью 1:5, то есть 0,20
	{
		return rand()%2+5; //	либо 0+5, либо 1+5, то есть возвращает 5 или 6
	}					   //	вероятность выпадения 0,20 / 2 = 0,10, как и заказывали
	else //в этой ветке шансы уже равны 0,80
	{
		if (!(rand()%5)) //события выполняются с вероятностью 0,80 * (1:5) = 0,16
		{
			return rand()%2+1; // либо 0+1, либо 1+1, то есть возвращает 1 или 2
		}					   // вероятность выпадения 0,16 / 2 = 0,08, как и заказывали
		else //в этой ветке шансы равны 0,80-0,16 = 0,64
		{
			return rand()%2+3; // возвращает либо 0+3, либо 1+3, то есть 3 или 4
		}					   // вероятность выпадения 0,64 / 2 = 0,32, как и заказывали
	}
}

int main()
{
	srand(time(0));
	printf("rand nums\n");
	for (int i = 0; i < 10000; i++)
		printf("%d\t", getrand());
	getchar();
}
Здесь правда я сильно обобщил - лучше для получения вероятностей и самих чисел использовать разные генераторы сл.чис., потому что иначе нормальный разброс не получится.
Ищете информацию по C++?
cplusplus.com

Последний раз редактировалось Сtrl; 10.04.2011 в 15:17.
Сtrl вне форума Ответить с цитированием
Старый 10.04.2011, 12:41   #16
EC.cpp
Пользователь
 
Регистрация: 09.04.2011
Сообщений: 30
По умолчанию

Вероятность выпадания значений фукции rand() не поддается параметризации или систематизации, т.е. нельзя сказать с какой вероятностью какое значение выпадет - это функция генерации воистину случайного числа.
Чуть подробнее о методах порождения случайных величин написано тут (ток на английском)

Вышесказанное означает, что Вы обычным применением метода rand() никогда не получите заданное распределение вероятностей.
EC.cpp вне форума Ответить с цитированием
Старый 10.04.2011, 12:45   #17
Сtrl
C++
Форумчанин
 
Аватар для Сtrl
 
Регистрация: 27.03.2011
Сообщений: 803
По умолчанию

Цитата:
это функция генерации воистину случайного числа.
На это мой алгоритм и рассчитан, проблема одна - на самом-то деле оно, как ни крути, псевдослучайное.
Ищете информацию по C++?
cplusplus.com
Сtrl вне форума Ответить с цитированием
Старый 10.04.2011, 12:50   #18
EC.cpp
Пользователь
 
Регистрация: 09.04.2011
Сообщений: 30
По умолчанию

Цитата:
Сообщение от Сtrl Посмотреть сообщение
На это мой алгоритм и рассчитан, проблема одна - на самом-то деле оно, как ни крути, псевдослучайное.
Вот именно поэтому, я предлагаю использовать этот самый rand() только для выборки 1-го из 100 чисел с последующий его перестановкой в списке - в результате мы получим перемешанную последовательность, но при выводе их на экран вероятности будут соответствовать строго заданным параметрам.
EC.cpp вне форума Ответить с цитированием
Старый 10.04.2011, 13:35   #19
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Цитата:
Сообщение от EC.cpp Посмотреть сообщение
знаете вот что было плохо в Советском Союзе? :-)
Знаю Но не об этом сейчас речь...

Цитата:
Сообщение от EC.cpp Посмотреть сообщение
зачем мне этим заниматься?
Незачем. Если это - не является предметом Вашей профессиональной специализации (так что подходящие исходники - всегда под рукой), то, кроме удовлетворённого тщеславия, - незачем. Но эти Ваши слова только подтверждают мою реакцию на слово "просто", прозвучавшее (не из Ваших, правда, уст) в этом обсуждении.

Цитата:
Сообщение от EC.cpp Посмотреть сообщение
Я Вам предоставил алгоритм - ответ на вопрос КАК.
Да?

Цитата:
Сообщение от EC.cpp Посмотреть сообщение
Если Вы знаете ( знаете? :-) ) какие-либо другие, поделитесь пожалуйста с окружающими.
Хорошо. Я вечером в завалах посмотрю. Если окажется, что они остались на трёхдюймовых дискетах - тогда завтра.
Vago вне форума Ответить с цитированием
Старый 10.04.2011, 14:12   #20
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Уважаемый Сtrl, я использовал Вашу программку из #15, вызывая её вот таким образом.
Код:
int main() {
	
   double f[6] ;
   const int nSeeds = 100000 ;
   int   k ;

   srand(time(0)) ;
   printf("rand nums\n");

   for ( k = 0; k < 6; k++ )
      f[k] = 0. ;

   for (int i = 0; i < nSeeds; i++) {
      k = getrand() ;
      f[k-1] += 1. / double( nSeeds ) ;
   }

   for ( k = 0; k < 6; k++ ) 
      printf( "%1d - %.3f\n", k+1, f[k] ) ;

   getchar();
   return 0 ;

}
И получил вот что:
110410.jpg

Ну ладно. До вечера!
Vago вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вероятность выпадения в процентах ololo-schoolboy Общие вопросы C/C++ 6 25.01.2011 20:54
вывод рандомного числа с большей или меньшей вероятностью unbanned Паскаль, Turbo Pascal, PascalABC.NET 6 19.01.2011 07:04
Алгоритмы. Работа с вероятностью. anton_kovalev Помощь студентам 2 21.01.2010 10:27
Подпрограмма определяющая вероятность выпадения счастливого билетика. Doublefaced Помощь студентам 9 05.08.2009 15:00
Делфи(Консоль) и C# - Подпрограммы(Вероятность выпадения «счастливого билетика» ) Doublefaced Помощь студентам 3 30.06.2009 22:15