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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.09.2012, 12:43   #1
Ecclesiastes
 
Регистрация: 25.09.2012
Сообщений: 5
Вопрос Непонятности с rand()

Почему в результате выполнения данного кода, s1 и s2 настолько сильно различаются? s1 равняется ~250000, а s2 ~450000.

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

Код:
int main()
{ 
	srand ( time(NULL) );
	int m[4];
	for (int i = 0; i < 4; i++)
		m[i]=0;




	int s1 = 0, s2 = 0;
	for (int i = 0; i < 1000000; i++)
	{

		if (rand()%4 == rand()%4)
			s1++;

		m[rand() % 4] = 1;

		if (m[rand() % 4] == 1)
		{
			s2++; 
			m[0] = 0; m[1] = 0; m[2] = 0; m[3] = 0;
		}


	};

	return 0;
}

Последний раз редактировалось Ecclesiastes; 25.09.2012 в 12:49.
Ecclesiastes вне форума Ответить с цитированием
Старый 25.09.2012, 12:50   #2
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

Вероятность увеличения s2 больше, т.к. массив m вы обнуляете ТОЛЬКО если rand()%4 выдал номер ячейки с уже записанной единицей, а с каждой (не совсем с каждой, ну вы поняли) "безуспешной" итерацией цикла количество единиц в массиве возрастает.
Утверждение "в случайный элемент записывается 1 (остальные нули)" неверно.
Код:
if (m[rand() % 4] == 1)
		{
			s2++; 
			m[0] = 0; m[1] = 0; m[2] = 0; m[3] = 0;
		}
Для получения примерно одинаковых s1 и s2 я бы порекомендовал переписать этот кусок так:
Код:
if (m[rand() % 4] == 1)
		{
			s2++; 
                }
                m[0] = 0; m[1] = 0; m[2] = 0; m[3] = 0;
Благодарить в репутацию. Проклинать — туда же

Последний раз редактировалось Luuzuk; 25.09.2012 в 12:54.
Luuzuk вне форума Ответить с цитированием
Старый 25.09.2012, 12:52   #3
Ecclesiastes
 
Регистрация: 25.09.2012
Сообщений: 5
По умолчанию

Ах, точно! Спасибо!

Вопрос ичерпан.
Ecclesiastes вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
php+js непонятности с переменными mrgrudge PHP 0 18.11.2010 15:28
rand VAN32 Общие вопросы C/C++ 5 07.03.2010 21:38
Непонятности DSL-подключения Web-Gangsta Свободное общение 6 20.02.2010 16:10
Непонятности в чужом коде Filin86 Общие вопросы Delphi 1 18.02.2010 07:02
Cos, Sin и непонятности с ними =\\ Zeraim Общие вопросы Delphi 3 25.07.2009 01:38