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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.09.2010, 13:06   #11
Memfis_nya
Пользователь
 
Аватар для Memfis_nya
 
Регистрация: 04.11.2008
Сообщений: 29
По умолчанию

Цитата:
Сообщение от rrrFer Посмотреть сообщение
Код:
			for (i=0; i<10; i++){
				res*=L;
				res=res-((int)res/N)*N+(int)res%N;
				cout<<res<<" ";
			}
угадал, это вам надо?
Начала разбирать по строкам. Допустим, res у нас 2, L=4, N=5.
res*=L; // здесь res=2*4=8
res=res-((int)res/N)*N+(int)res%N; // 8-(8/5*5+8%5)=8-(1*5+3)=8-8=0

Или я снова что-то не так понимаю? =(
Memfis_nya вне форума Ответить с цитированием
Старый 26.09.2010, 13:16   #12
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
res=res-((int)res/N)*N+(int)res%N; // 8-(8/5*5+8%5)=8-(1*5+3)=8-8=0
все правильно, но возьми дробное res
rrrFer вне форума Ответить с цитированием
Старый 26.09.2010, 13:29   #13
Memfis_nya
Пользователь
 
Аватар для Memfis_nya
 
Регистрация: 04.11.2008
Сообщений: 29
По умолчанию

Но ведь res у нас объявлено как float.
Я все никак не пойму с этим оператором %. Почему например 5%3=2? Насколько я понимаю, % дает нам остаток от деления. Разве не должно быть тогда 5%3=666666 и так далее? Ведь если поделить 5 на 3, получится 1,66666, значит остатком и будет это самое 666666?
Memfis_nya вне форума Ответить с цитированием
Старый 26.09.2010, 13:31   #14
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

потому что остаток от деления 5 на 3 будет 2 ))
rrrFer вне форума Ответить с цитированием
Старый 26.09.2010, 13:35   #15
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

если вам надо .6666 поделите остаток еще раз, только перед делением укажите что хотите выполнить деление дробных чисел, иначе в ответе получите ноль.
типа (float)(2%3)/3;
rrrFer вне форума Ответить с цитированием
Старый 26.09.2010, 13:51   #16
Memfis_nya
Пользователь
 
Аватар для Memfis_nya
 
Регистрация: 04.11.2008
Сообщений: 29
По умолчанию

Все, наконец-то дошло! Спасибо! Я почему-то решила, что дробная часть - это и есть остаток от деления, совсем с ума сошла)
Но почему же при
Код:
for (int i=0; i<10; i++){
			res=(res*L)%N;
            cout<<res<<" ";
			}
мне выдают error: invalid operands of types `float' and `int' to binary `operator%'
Memfis_nya вне форума Ответить с цитированием
Старый 26.09.2010, 14:03   #17
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
мне выдают error: invalid operands of types `float' and `int' to binary `operator%'
Значит что нужен операн типа int а вы подставляете float.
слева и справа от оператора % должны стоять целые числа.
пишите так:
res=(int)(res*L)%N;
rrrFer вне форума Ответить с цитированием
Старый 26.09.2010, 14:07   #18
Memfis_nya
Пользователь
 
Аватар для Memfis_nya
 
Регистрация: 04.11.2008
Сообщений: 29
По умолчанию

Сделала так, теперь всё Int. Ошибка больше не выскакивает, зато у меня печатаются десять нулей вместо числовой последовательности. Что ж за напасть такая =(
Memfis_nya вне форума Ответить с цитированием
Старый 26.09.2010, 14:09   #19
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Memfis_nya
приведите пример что вы хотите подать на вход и получить на выходе
rrrFer вне форума Ответить с цитированием
Старый 26.09.2010, 14:26   #20
Memfis_nya
Пользователь
 
Аватар для Memfis_nya
 
Регистрация: 04.11.2008
Сообщений: 29
По умолчанию

Вот вообще задание:
Применение метода вычетов основано на том, что каждое последующее случайное число bk+1 образуется из предыдущего bk согласно рекуррентному соотношению
bk+1=l*bk(mod N)
которое означает, что число b равно остатку от деления на N произведения числа b на постоянный множитель l. Очевидно, что остаток от деления на N в общем случае имеет ту же разрядность, что и число N, т.е. выбором числа N по существу определяется разрядность получаемых случайных чисел.


Может, я чего-то неправильно поняла снова, но вот если написать
Код:
for (int i=0; i<10; i++){
			res=(res*L)%N;
            cout<<res<<" ";
			}
то какие бы числа ни вводились, получится либо последовательность нулей (в случае, если остатком от деления окажется ноль), либо последовательность из одних и тех же повторяющихся чисел. Какой же это тогда генератор псевдослучайных чисел, когда они по идее должны соответствовать таким требованиям:
генерируемая последовательность должна иметь большой период;
генерируемая последовательность не должна иметь скрытых периодично-стей;
генерируемая последовательность должна иметь равномерный спектр.

То есть ошибка в самом задании, получается? Или у меня в голове @_@
Memfis_nya вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Что при нажатии на кнопку, выдало остаток от деления в Edit1 prikolist Общие вопросы C/C++ 4 03.04.2009 18:57
Получить остаток от деления Cpluser Общие вопросы C/C++ 18 26.02.2009 18:05
остаток от деления % Division Общие вопросы C/C++ 5 25.12.2008 14:08
Создать массив только из тех элементов, у которых остаток от деления на М равен L (0<=L<=M-1) Айвенго Microsoft Office Excel 2 12.01.2008 16:28