Задача 6 — разбор задания ЕГЭ по предмету Информатика
- Newtonew
- ProTeachers
- MOOC 2016
- Большая переменная
Мы в соц.сетях:
- Статьи
- ·
- Разборы
- ·
- Новости
Написать статью
Решение №1
От нас требуется найти минимальное N, при котором в результате работы алгоритма получится число, большее 125. Раз больше 125 и минималное, давайте рассмотрим число 126, как наименьшее, которое больше 125.
Давайте прежде всего проверим, что 126 могло получиться в результате работы алгоритма.
Таким образом, ответ — 31.
Evgeny Smirnov
Сообщение:
Запрос успешно отправлен. В ближайшее время расширенный доступ будет предоставлен.
– Oбразование как Стиль ЖизниПрисылайте свои колонки
и предложения
У вас есть интересная новость
или материал из сферы образования
или популярной науки?
Расскажите нам!
[email protected]
© 2014-2023 Newtonew. 12+
Просветительский медиа-проект об образовании,
посвящённый самым актуальным и полезным
концепциям, теориям и методикам, технологиям
и исследованиям, продуктам и сервисам. Мы
говорим о том, как развиваются и изменяются
образование и наука.
ЕГЭ спецпроект ProTeachers
MOOC 2016 Большая переменная
Физика: игра света
Маршрут в будущее
Считаные годы
Образование XXI века
Мы используем файлы cookie для улучшения пользовательского опыта. Подробнее вы можете посмотреть в нашем пользовательском соглашении.
App Store Google Play
Подписаться на рассылку
Подписаться на рассылку
Авторизация на сайте
Вход через соц.сети:
ВКонтакте Facebook Google
Новый пользователь
Введите ваш email:
Введите пароль:
Повторите пароль:
назад
Напомнить пароль
Введите email, на который вы зарегистрированы:
назад
Пароль выслан
Мы выслали ваш пароль для входа в систему на указанный email.
Не забывайте о том, что вы можете авторизоваться в системе через социальные сети.
Вход через соц.сети:
ВКонтакте Facebook Google
Подтвердите регистрацию
На указанный e-mail было отправлено письмо со ссылкой. Пожалуйста, перейдите по ссылке для подтверждения.
Вход через соц.сети:
ВКонтакте Facebook Google
Регистрация подтверждена
Вы успешно зарегистрировались
05. Алгоритмы R и N
- Сборник ЕГЭ-2023
- Просмотров: 6110
ВАРИАНТ 1 На вход алгоритма подаётся натуральное число N. Алгоритм строит по нему новое число R следующим образом. 1) Строится двоичная запись числа N. 2) Далее если исходное число четное, то справа к построенной двоичной записи числа N приписывается 0, если нечетное, то приписывается 1. 3) Далее полученная на втором шаге алгоритма запись обрабатывается по следующему правилу: а) если количество единиц в двоичной записи кратно трем, то в этой записи два левых разряда заменяются на 11; б) если количество единиц в двоичной записи некратно трем, то в этой записи два левых разряда заменяются на 10. Полученная таким образом запись является двоичной записью искомого числа R. Например, для исходного числа 610 = 1102 результатом является число 10002 = 810, а для исходного числа 310 = 112, результатом является число 1112 = 710. Укажите минимальное число N, после обработки которого с помощью этого алгоритма получается число R, не меньшее чем 26. |
Решение и ответ
Ответ: 9 |
||
ВАРИАНТ 2 На вход алгоритма подаётся натуральное число N. Алгоритм строит по нему новое число R следующим образом. 1) Строится двоичная запись числа N. 2) Далее если исходное число четное, то справа к построенной двоичной записи числа N приписывается 0, если нечетное, то приписывается 1. 3) Далее полученная на втором шаге алгоритма запись обрабатывается по следующему правилу: а) если количество единиц в двоичной записи кратно трем, то в этой записи два левых разряда заменяются на 11; б) если количество единиц в двоичной записи некратно трем, то в этой записи два левых разряда заменяются на 10. Полученная таким образом запись является двоичной записью искомого числа R. Например, для исходного числа 610 = 1102 результатом является число 10002 = 810, а для исходного числа 310 Укажите максимальное число N, после обработки которого с помощью этого алгоритма получается число R, не большее чем 37. В ответе запишите это число в десятичной системе счисления. |
Решение и ответ Решение как в первом варианте. for x in range(1,30): #перебираем х if N.count(‘1’)%3 == 0: # преобразование 3 шага print(x, int(R,2)) # переводим R в десятичную систему счисления Из таблицы значений видим, что наибольшее N = 25 для R = 35 Ответ: 25 |
||
ВАРИАНТ 3 На вход алгоритма подаётся натуральное число N. Алгоритм строит по нему новое число R следующим образом. 1) Строится двоичная запись числа N. 2) Далее эта запись обрабатывается по следующему правилу: а) если количество значащих цифр в двоичной записи числа четное, то к этой записи в середину дописывается 1; б) если количество значащих цифр в двоичной записи числа нечетное, то запись не изменяется. Полученная таким образом запись является двоичной записью искомого числа R. Например, для исходного числа 510 = 1012 результатом является число 1012 = 510, а для исходного числа 210 = 102, результатом является число 1102 = 610. Укажите минимальное число N, после обработки которого с помощью этого алгоритма получается число R, не меньшее чем 26. В ответе запишите это число в десятичной системе счисления. |
Решение и ответ for x in range(1,30): #перебираем хN=str(bin(x)[2:]) #получаем двоичную запись, убираем первые 2 символа 0b if len(N)%2 == 0: R = N[:len(N)//2] + ‘1’ +N[len(N)//2:] else: R = N print(x, int(R,2)) # переводим R в десятичную систему счисления Из таблицы значений видим, что наименьшее N = 12 для R = 28 Ответ: 12 |
||
ВАРИАНТ 4 На вход алгоритма подаётся натуральное число N. Алгоритм строит по нему новое число R следующим образом. 1) Строится двоичная запись числа N. 2) Далее эта запись обрабатывается по следующему правилу: а) если количество значащих цифр в двоичной записи числа четное, то к этой записи в середину дописывается 1; б) если количество значащих цифр в двоичной записи числа нечетное, то запись не изменяется. Полученная таким образом запись является двоичной записью искомого числа R. Например, для исходного числа 510 = 1012 результатом является число 1012 = 510, а для исходного числа 210 = 102, результатом является число 1102 = 610. Укажите максимальное число N, после обработки которого с помощью этого алгоритма получается число R, не большее чем 26. В ответе запишите это число в десятичной системе счисления. |
Решение и ответ for x in range(1,30): #перебираем хN=str(bin(x)[2:]) #получаем двоичную запись, убираем первые 2 символа 0b if len(N)%2 == 0: R = N[:len(N)//2] + ‘1’ +N[len(N)//2:] else: R = N print(x, int(R,2)) # переводим R в десятичную систему счисления Из таблицы значений видим, что наибольшее N = 26 для R = 26 Ответ: 26 |
||
ВАРИАНТ 5 Автомат получает на вход трехзначное число. По этому число строится новое число по следующим правилам: 1. Вычисляются суммы квадратов первой и второй, а также второй и третьей цифр исходного числа. 2. Полученные два числа записываются друг за другом в порядке невозрастания (без разделителей). Пример. Исходное число: 621. Суммы квадратов цифр: 62 + 22 = 40; 22 + 12 = 5. Результат: 405. Укажите наибольшее число, в результате обработки которого автомат выдаст число 9752. |
Решение и ответ for x in range(100,1000):a= x//100 b = (x//10)%10 c = x % 10 if (a ** 2 + b**2 == 97 and b**2 + c**2 == 52) or (a ** 2 + b**2 == 52 and b**2 + c**2 == 97): print(a*100 +b*10+c) Ответ: 946 |
||
ВАРИАНТ 6 Автомат получает на вход трехзначное число. По этому число строится новое число по следующим правилам: 1. Вычисляются суммы квадратов первой и второй, а также второй и третьей цифр исходного числа. 2. Полученные два числа записываются друг за другом в порядке невозрастания (без разделителей). Пример. Исходное число: 621. Суммы квадратов цифр: 62 + 22 = 40; 22 + 12 = 5. Результат: 405. Укажите наибольшее число, в результате обработки которого автомат выдаст число 7434. |
Решение и ответ for x in range(100,1000): a= x//100 if (a ** 2 + b**2 == 74 and b**2 + c**2 == 34) or (a ** 2 + b**2 == 34 and b**2 + c**2 == 74): print(a*100 +b*10+c) Ответ: 753 |
||
ВАРИАНТ 7 Автомат получает на вход трехзначное число. По этому число строится новое число по следующим правилам: 1. Перемножаются все цифры исходного числа. 2. Суммируются все цифры исходного числа. 3. Полученные два числа записываются друг за другом в порядке невозрастания (без разделителей). Пример. Исходное число: 621. Произведение цифр 6х2х1 = 12. Суммы цифр: 6 + 2 + 1 = 9 Результат: 129. Укажите наибольшее число, в результате обработки которого автомат выдаст число 33621. |
Решение и ответ for x in range(100,1000): if p == 336 and s == 21: Ответ: 876 |
||
ВАРИАНТ 8 Автомат получает на вход трехзначное число. По этому число строится новое число по следующим правилам: 1. Перемножаются все цифры исходного числа. 2. Суммируются все цифры исходного числа. 3. Полученные два числа записываются друг за другом в порядке невозрастания (без разделителей). Пример. Исходное число: 621. Произведение цифр 6х2х1 = 12. Суммы цифр: 6 + 2 + 1 = 9 Результат: 129. Укажите наибольшее число, в результате обработки которого автомат выдаст число 24019. |
Решение и ответ for x in range(100,1000): if p == 240 and s == 19: Ответ: 865 |
||
ВАРИАНТ 9 На вход алгоритма подаётся натуральное число N. Алгоритм строит по нему новое число R следующим образом. 1) Из числа N вычитается остаток от деления N на 4. 2) Строится двоичная запись полученного результата. 3) К этой записи дописываются справа еще два разряда по следующему правилу: а) складываются все цифры построенной двоичной записи, и остаток от деления суммы на 2 дописывается в конец числа (справа). Например, запись 11100 преобразуется в запись 111001; б) над этой записью производятся те же действия — справа дописывается остаток от деления суммы ее цифр на 2. Полученная таким образом запись является двоичной записью искомого числа R. Укажите минимальное число R, большее 56, которое может являться результатом работы данного алгоритма. В ответе запишите это число в десятичной системе счисления. |
Решение и ответ for x in range(5,20): #перебираем х if N. count(‘1’)%2 == 0: print(x, int(R,2)) # переводим R в десятичную систему счисления Ответ: 66 |
||
ВАРИАНТ 10 На вход алгоритма подаётся натуральное число N. Алгоритм строит по нему новое число R следующим образом. 1) Из числа N вычитается остаток от деления N на 4. 2) Строится двоичная запись полученного результата. 3) К этой записи дописываются справа еще два разряда по следующему правилу: а) складываются все цифры построенной двоичной записи, и остаток от деления суммы на 2 дописывается в конец числа (справа). Например, запись 11100 преобразуется в запись 111001; б) над этой записью производятся те же действия — справа дописывается остаток от деления суммы ее цифр на 2. Полученная таким образом запись является двоичной записью искомого числа R. Укажите минимальное число R, большее 100, которое может являться результатом работы данного алгоритма. В ответе запишите это число в десятичной системе счисления. |
Решение и ответ Решение как в варианте 9.for x in range(20,35): #перебираем х N = x — x % 4 if N.count(‘1’)%2 == 0: print(x, int(R,2)) # переводим R в десятичную систему счисления Из таблицы полученных значений мы видим, что минимальное больше 100, R=114. Ответ: 114 |
||
ВАРИАНТ 11 На вход алгоритма подаётся натуральное число N. Алгоритм строит по нему новое число R следующим образом. 1) Из числа N вычитается остаток от деления N на 4. 2) Строится двоичная запись полученного результата. 3) К этой записи дописываются справа еще два разряда по следующему правилу: а) складываются все цифры построенной двоичной записи, и остаток от деления суммы на 2 дописывается в конец числа (справа). Например, запись 11100 преобразуется в запись 111001; б) над этой записью производятся те же действия — справа дописывается остаток от деления суммы ее цифр на 2. Полученная таким образом запись является двоичной записью искомого числа R. Укажите наибольшее число N, для которого результат работы данного алгоритма меньше числа 64. В ответе запишите это число в десятичной системе счисления. |
Решение и ответ Решение как в варианте 9. for x in range(10,35): #перебираем х if N. count(‘1’)%2 == 0: print(x, int(R,2)) # переводим R в десятичную систему счисления Из таблицы полученных значений мы видим, что наибольшее N=15, соответствует R=48 Ответ: 15 |
||
ВАРИАНТ 12 На вход алгоритма подаётся натуральное число N. Алгоритм строит по нему новое число R следующим образом. 1) Из числа N вычитается остаток от деления N на 4. 2) Строится двоичная запись полученного результата. 3) К этой записи дописываются справа еще два разряда по следующему правилу: а) складываются все цифры построенной двоичной записи, и остаток от деления суммы на 2 дописывается в конец числа (справа). Например, запись 11100 преобразуется в запись 111001; б) над этой записью производятся те же действия — справа дописывается остаток от деления суммы ее цифр на 2. Полученная таким образом запись является двоичной записью искомого числа R. Укажите наибольшее число N, для которого результат работы данного алгоритма меньше числа 47. В ответе запишите это число в десятичной системе счисления. |
Решение и ответ Решение как в варианте 9.Из таблицы полученных значений мы видим, что наибольшее N=11, соответствует R=34. Ответ: 11 |
||
ВАРИАНТ 13 На вход алгоритма подаётся натуральное число N. Алгоритм строит по нему новое число R следующим образом. 1) Из числа N вычитается остаток от деления N на 8, после чего прибавляется остаток от деления N на 2. 2) Строится двоичная запись полученного результата. 3) К этой записи дописываются справа еще два разряда по следующему правилу: а) складываются все цифры построенной двоичной записи, и остаток от деления суммы на 2 дописывается в конец числа (справа). Например, запись 11100 преобразуется в запись 111001; б) над этой записью производятся те же действия — справа дописывается остаток от деления суммы ее цифр на 2. Полученная таким образом запись является двоичной записью искомого числа R. Укажите минимальное число R, большее 90, которое может являться результатом работы данного алгоритма. В ответе запишите это число в десятичной системе счисления. |
Решение и ответ for x in range(10,35): #перебираем х if N.count(‘1’)%2 == 0: if N.count(‘1’)%2 == 0: print(x, int(R,2)) # переводим R в десятичную систему счисления Из таблицы полученных значений мы видим, что наименьшее, большее 90, R=96. Ответ: 96 |
||
ВАРИАНТ 14 На вход алгоритма подаётся натуральное число N. Алгоритм строит по нему новое число R следующим образом. 1) Из числа N вычитается остаток от деления N на 8, после чего прибавляется остаток от деления N на 2. 2) Строится двоичная запись полученного результата. 3) К этой записи дописываются справа еще два разряда по следующему правилу: а) складываются все цифры построенной двоичной записи, и остаток от деления суммы на 2 дописывается в конец числа (справа). Например, запись 11100 преобразуется в запись 111001; б) над этой записью производятся те же действия — справа дописывается остаток от деления суммы ее цифр на 2. Полученная таким образом запись является двоичной записью искомого числа R. Укажите минимальное число R, большее 97, которое может являться результатом работы данного алгоритма. В ответе запишите это число в десятичной системе счисления. |
Решение и ответ Решение как в варианте 13.Из таблицы полученных значений мы видим, что наименьшее, большее 97, R=130. Ответ: 130 |
||
ВАРИАНТ 15 На вход алгоритма подаётся натуральное число N. Алгоритм строит по нему новое число R следующим образом. 1) Строится двоичная запись числа N. 2) Каждый разряд этой записи заменяется двумя разрядами по следующему правилу: если в разряде стоит 0, то вместо него пишется 00; если в разряде стоит 1, то 1 заменяется на 11. Например, двоичная запись 1001 числа 9 будет преобразована в 11000011. Полученная таким образом запись (в ней в два раза больше разрядов, чем в записи исходного числа N) является двоичной записью искомого числа R — результата работы данного алгоритма. Укажите минимальное число R, большее 32 которое может являться результатом работы данного алгоритма. В ответе запишите это число в десятичной системе счисления. |
Решение и ответ for x in range(1,50): #перебираем х R = int(N,2)# переводим R в десятичную систему счисления print(x, R) Из таблицы полученных значений мы видим, что наименьшее, большее 32, R = 48. Ответ: 48 |
||
ВАРИАНТ 16 На вход алгоритма подаётся натуральное число N. Алгоритм строит по нему новое число R следующим образом. 1) Строится двоичная запись числа N. 2) Каждый разряд этой записи заменяется двумя разрядами по следующему правилу: если в разряде стоит 0, то вместо него пишется 00; если в разряде стоит 1, то 1 заменяется на 11. Например, двоичная запись 1001 числа 9 будет преобразована в 11000011. Полученная таким образом запись (в ней в два раза больше разрядов, чем в записи исходного числа N) является двоичной записью искомого числа R — результата работы данного алгоритма. Укажите минимальное число R, большее 63 которое может являться результатом работы данного алгоритма. В ответе запишите это число в десятичной системе счисления. |
Решение и ответ Решение как в варианте 15.Из таблицы полученных значений мы видим, что наименьшее, большее 63, R = 192. Ответ: 192 |
||
ВАРИАНТ 17 На вход алгоритма подаётся натуральное число N. Алгоритм строит по нему новое число R следующим образом. 1) Строится двоичная запись числа N. 2) Каждый разряд этой записи заменяется двумя разрядами по следующему правилу: если в разряде стоит 0, то вместо него пишется 01; если в разряде стоит 1, то 1 заменяется на 10. Например, двоичная запись 1001 числа 9 будет преобразована в 10010110. Полученная таким образом запись (в ней в два раза больше разрядов, чем в записи исходного числа N) является двоичной записью искомого числа R — результата работы данного алгоритма. Укажите минимальное число R, большее 63 которое может являться результатом работы данного алгоритма. В ответе запишите это число в десятичной системе счисления. |
Решение и ответ for x in range(5,20): #перебираем х print(N) print(x, R) Из таблицы полученных значений мы видим, что наименьшее, большее 63, R = 149. Ответ: 149 |
||
ВАРИАНТ 18 На вход алгоритма подаётся натуральное число N. Алгоритм строит по нему новое число R следующим образом. 1) Строится двоичная запись числа N. 2) Каждый разряд этой записи заменяется двумя разрядами по следующему правилу: если в разряде стоит 0, то вместо него пишется 01; если в разряде стоит 1, то 1 заменяется на 10. Например, двоичная запись 1001 числа 9 будет преобразована в 10010110. Полученная таким образом запись (в ней в два раза больше разрядов, чем в записи исходного числа N) является двоичной записью искомого числа R — результата работы данного алгоритма. Укажите максимальное нечетное число R, меньшее 256 которое может являться результатом работы данного алгоритма. В ответе запишите это число в десятичной системе счисления. |
Решение и ответ Решение как в варианте 17.Из таблицы полученных значений мы видим, что максимальное нечетное , меньшее 256, R = 169. Ответ: 169 |
||
ВАРИАНТ 19 На вход алгоритма подаётся натуральное число N. Алгоритм строит по нему новое число R следующим образом. 1) Строится двоичная запись числа N. 2) К этой записи дописываются справа еще два разряда по следующему правилу: если N делится нацело на 4, в конец числа (справа) дописывается сначала 0, а затем еще один 0; если N при делении на 4 дает остаток 1, то в конец числа (справа) дописывается сначала 0, потом 1; если N при делении на 4 дает остаток 2, то в конец числа (справа) дописывается сначала 1, потом 0; если N при делении на 4 дает остаток 3, то в конец числа (справа) дописывается сначала 1, затем еще 1. Например, двоичная запись 1001 числа 9 будет преобразована в 100101, а двоичная запись 1100 числа 12 будет преобразована в 110000. Полученная таким образом запись (в ней на два разряда больше, чем в записи исходного числа N) является двоичной записью искомого числа R — результата работы данного алгоритма. Укажите максимальное число R, которое меньше 100 и может являться результатом работы данного алгоритма. В ответе запишите это число в десятичной системе счисления. |
Решение и ответ for x in range(5,30): #перебираем х R = int(N,2)# переводим R в десятичную систему счисления print(x, R) Из таблицы полученных значений мы видим, что наибольшее R, меньшее 100, равно 96. Ответ: 96 |
||
ВАРИАНТ 20 На вход алгоритма подаётся натуральное число N. Алгоритм строит по нему новое число R следующим образом. 1) Строится двоичная запись числа N. 2) К этой записи дописываются справа еще два разряда по следующему правилу: если N делится нацело на 4, в конец числа (справа) дописывается сначала 0, а затем еще один 0; если N при делении на 4 дает остаток 1, то в конец числа (справа) дописывается сначала 0, потом 1; если N при делении на 4 дает остаток 2, то в конец числа (справа) дописывается сначала 1, потом 0; если N при делении на 4 дает остаток 3, то в конец числа (справа) дописывается сначала 1, затем еще 1. Например, двоичная запись 1001 числа 9 будет преобразована в 100101, а двоичная запись 1100 числа 12 будет преобразована в 110000. Полученная таким образом запись (в ней на два разряда больше, чем в записи исходного числа N) является двоичной записью искомого числа R — результата работы данного алгоритма. Укажите максимальное число R, которое меньше 111 и может являться результатом работы данного алгоритма. В ответе запишите это число в десятичной системе счисления |
Решение и ответ Из таблицы полученных значений мы видим, что максимальное R, меньшее 111, равно 106. Ответ: 106 |
- Вперед
РСЯ футер
python — Пожалуйста, помогите мне разобраться с проблемой. TypeError: объект ‘int’ не является итерируемым — эта ошибка возникает у меня при расчете.
Что я делаю не так?Задача выглядит так: На вход алгоритма подается натуральное число N. На его основе алгоритм строит новое число R следующим образом.
- Вычисляется сумма S1 всех нечетных цифр десятичной системы счисления числа N. Если нечетных цифр нет, сумма S1 считается равной 0, .
- Вычисляется сумма S2 всех цифр десятичной записи числа N, стоящих на позициях с нечетными числами. Позиции нумеруются слева направо, начиная с 1.
- Результат R рассчитывается как модуль разницы между S1 и S2. Например, N = 4321. Сумма нечетных цифр S1 = 3 + 1 = 4. Сумма цифр в позициях с нечетными номерами S2 = 4 + 2 = 6. Результат алгоритма R = 6 – 4 = 2. . Укажите наименьшее число, в результате обработки которого по данному алгоритму получится число 31.
Вот мой код:
для диапазона (100): s1 = сумма (int (x) для x в a, если int (x)% 2 == 1) s2 = интервал (а [0]) R = абс (s1-s2) если R == 31: печать (а, р)
Эта строка кода moment(s1 = sum(int(x) for x in a if int(x) % 2))
возвращает ошибку:
TypeError: объект ‘int’ не является итерируемым
Что я делаю не так или как написать программу для нахождения суммы всех нечетных цифр числа?
- питон
У вас есть:
для диапазона (100):
Итак, на следующей строке a
будет 0
в первый раз, затем на второй итерации это будет 1
и т. д. a
имеет тип int
.
Следующая строка:
s1 = sum(int(x) for x in a if int(x) % 2)
Так как a
является int
, for x в
пытается перебрать целое число, но это невозможно. Итак, вы получаете ошибку TypeError: 'int' object is not iterable
.
> s1 = sum(int(x) for x in a if int(x) % 2)
Ваши короткие имена переменных не помогают прояснить сложность с этим кодом. Давайте определим temp:
цифр = list(map(int, str(a))) s1 = сумма (d для d цифрами, если d % 2) s2 = цифры [0]
(вызов list()
не является строго необходимым,
но я подумал, что это может быть полезно во время отладки.)
По-видимому, s1
означает «первую сумму».
Я понятия не имею, как «вторая сумма» вписывается в код OP.
Вам бы посоветовали переименовать s2
если хотите
люди для полезного сотрудничества.
Неясно, что означает магическое число 31
.
См. https://stackoverflow.com/help/minimal-reproducible-example. Непонятно, какую проблему вы пытаетесь решить и каков будет ожидаемый результат.
Зарегистрируйтесь или войдите в систему
Зарегистрируйтесь с помощью Google Зарегистрироваться через Facebook Зарегистрируйтесь, используя электронную почту и парольОпубликовать как гость
Электронная почтаТребуется, но никогда не отображается
Опубликовать как гость
Электронная почтаТребуется, но не отображается
9Алгоритм 0000. Расширьте случайный диапазон от 1–5 до 1–7Думаю, у меня есть четыре ответа, два из которых дают точные решения, такие как у @Adam Rosenfield, но без проблемы с бесконечным циклом, а два других дают почти идеальное решение, но быстрее реализация, чем первая.
Лучшее точное решение требует 7 вызовов rand5
, но давайте продолжим, чтобы понять.
Сила ответа Адама в том, что он дает идеальное равномерное распределение, и существует очень высокая вероятность (21/25), что потребуются только два вызова rand5(). Однако в худшем случае это бесконечный цикл.
Первое решение ниже также дает идеальное равномерное распределение, но требует в общей сложности 42 вызовов rand5
. Никаких бесконечных циклов.
Вот реализация R:
rand5 <- function() sample(1:5,1) rand7 <- function() (sum(sapply(0:6, function(i) i + rand5() + rand5()*2 + rand5()*3 + rand5()*4 + rand5()*5 + rand5 ()*6)) %% 7) + 1
Для людей, не знакомых с R, вот упрощенная версия:
rand7 = function(){ г = 0 для (я в 0:6) { r = r + i + rand5() + rand5()*2 + rand5()*3 + rand5()*4 + rand5()*5 + rand5()*6 } вернуть г %% 7 + 1 } 96) %%7 = 0 . Таким образом, мы можем разделить сгенерированные случайные числа на равные группы по 7. Подробнее об этом читайте во втором методе.Вот все возможные комбинации:
table(apply(expand.grid(c(outer(1:5,0:6,"+")),(1:5)*2,(1:5) *3,(1:5)*4,(1:5)*5,(1:5)*6),1,сумма) %% 7 + 1) 1 2 3 4 5 6 7 15625 15625 15625 15625 15625 15625 15625Я думаю, достаточно просто показать, что метод Адама будет работать намного быстрее. Вероятность того, что 42 или более обращений к 9(-17) ).
Теперь второй метод, почти унифицированный, но требующий 6 вызовов
rand5
:rand7 <- function() (sum(sapply(1:6,function(i) i*rand5())) % % 7) + 1Вот упрощенная версия:
rand7 = function(){ г = 0 для (я в 1: 6) { г = г + я*rand5() } вернуть г %% 7 + 1 }По сути, это одна итерация метода 1. Если мы сгенерируем все возможные комбинации, вот результат:
table(apply(expand.grid(1:5,(1:5)*2,(1:5)) *3,(1:5)*4,(1:5)*5,(1:5)*6),1,сумма) %% 7 + 1) 1 2 3 4 5 6 7 2233 2232 2232 2232 2232 2232 2232 96 %% 7 = 0).Если аргумент метода 1 и 2 понятен, следует метод 3, который требует всего 7 вызовов
rand5
. На данный момент я чувствую, что это минимальное количество вызовов, необходимое для точного решения.Вот реализация R:
rand5 <- function() sample(1:5,1) rand7 <- function() (sum(sapply(1:7, function(i) i * rand5())) %% 7) + 1Для людей, не знакомых с R, вот упрощенная версия:
rand7 = function(){ г = 0 для (я в 1:7) { г = г + я * ранд5 () } вернуть г %% 7 + 1 }Распределение
рандов5
будет сохранено. Если мы посчитаем, каждая из 7 итераций цикла имеет 5 возможных результатов, таким образом, общее количество возможных комбинаций равно(7 * 5) %% 7 = 0
. Таким образом, мы можем разделить сгенерированные случайные числа на равные группы по 7. Подробнее об этом читайте в методах 1 и 2.Вот все возможные комбинации:
table(apply(expand.grid(0:6,(1:5)),1,sum) %%7 + 1) 1 2 3 4 5 6 7 5 5 5 5 5 5 5 93 ~ 0,004 ).
Leave A Comment