Comments 28
Глядя на
не могу удержаться от ссылки: rand() Considered Harmful
srand(time(NULL));
иmessages[rand()%20]
не могу удержаться от ссылки: rand() Considered Harmful
Ну и
улыбнуло
if (first_time == true)
улыбнуло
не могу удержаться от ссылки: rand() Considered Harmful
Я оттуда понял только то, что так делать плохо. А как хорошо? Я не понял тот пример, который показывался в конце.
Ну и if (first_time == true) улыбнуло
Почему? Потому что можно написать if (first_time)?
Хорошо делать через классы заголовка random из C++11. Правда мой комментарий получается немного мимо кассы, т.к. у вас C, да и вообще для такой задачи ничего страшного в небольшой неравномерности распределения нет.
Да, не понимаю зачем сравнивать булевские значения на равенство, на мой взгляд и длиннее и менее читаемо чем использовать их напрямую.
Да, не понимаю зачем сравнивать булевские значения на равенство, на мой взгляд и длиннее и менее читаемо чем использовать их напрямую.
Хорошо делать через классы заголовка random из C++11. Правда мой комментарий получается немного мимо кассы, т.к. у вас C, да и вообще для такой задачи ничего страшного в небольшой неравномерности распределения нет.
Может лучше тогда так сделать? rand()/(65535/21)
В указанном вами коде получается совсем печально. С вероятностью около 0.5% будет получаться 21 на выходе — наверняка это не было запланировано.
В видео кстати похожий пример был рассмотрен. рекомендую.
В целом ситуация такова, что либо мы получаем неравномерное распределение, либо нужно в некоторых случаях делать повторный запрос к генератору случайных чисел, что означает что время работы будет неопределенное.
Более-менее будет работать следующий код:
В видео кстати похожий пример был рассмотрен. рекомендую.
В целом ситуация такова, что либо мы получаем неравномерное распределение, либо нужно в некоторых случаях делать повторный запрос к генератору случайных чисел, что означает что время работы будет неопределенное.
Более-менее будет работать следующий код:
// работает только если range <= RAND_MAX
int rand(int range) {
int x;
while ((x = rand()) >= RAND_MAX / range * range) ;
return x % range;
}
arc4random_uniform(upper_bound) из stdlib
Там 30 минут. Можно в кратце, пожалуйста?
1) time(NULL) — возвращает не совсем тот тип, что принимает srand — но это мелочь
2) time(NULL) возвращает время с точностью до секунды, что не делает seed довольно предсказуемым
3) сам по себе rand() довольно низкокачественный генератор
4) rand() возвращает грубо говоря число от 0 до 65535, что значит что числа от 0 до 15 в rand()%20 будут более вероятны чем числа от 15 до 19. Мораль: не делать rand() % N.
5) Предлагается использовать заголовок random из C++11, но в данном случае как я понял у автора C, так что это недоступно
2) time(NULL) возвращает время с точностью до секунды, что не делает seed довольно предсказуемым
3) сам по себе rand() довольно низкокачественный генератор
4) rand() возвращает грубо говоря число от 0 до 65535, что значит что числа от 0 до 15 в rand()%20 будут более вероятны чем числа от 15 до 19. Мораль: не делать rand() % N.
5) Предлагается использовать заголовок random из C++11, но в данном случае как я понял у автора C, так что это недоступно
что-то я не понят про пункт 4, можно поподробнее? это все же остаток от деления, а не его результат. Грубо говоря, это группа вычетов, поэтому при равномерном распределении все будет от 0 до 19
Для простоты рассмотрим более простой пример (вывод будет верен и для исходного, просто числа другие). Пусть rand() равновероятно возвращает число от 0 до 15. А у нас есть 10 поз с номерами от 0 до 9.
Что случится если мы будем выбирать позу по формуле rand() % 10?
Вероятность выбрать 0 будет равна 2/16 = 1/8, т.к. она будет выбираться в случаях когда rand() вернул 0 или 10.
Вероятность выбрать 9 будет равна 1/16, т.к. она будет выбирать только в случае когда rand() вернул 9.
Что ещё хуже (не в примере с позами. а вообще) — у нас не просто неравномерное распределение — а ещё и среднее смещено в сторону нуля, т.к. более вероятны более маленькие числа.
Что случится если мы будем выбирать позу по формуле rand() % 10?
Вероятность выбрать 0 будет равна 2/16 = 1/8, т.к. она будет выбираться в случаях когда rand() вернул 0 или 10.
Вероятность выбрать 9 будет равна 1/16, т.к. она будет выбирать только в случае когда rand() вернул 9.
Что ещё хуже (не в примере с позами. а вообще) — у нас не просто неравномерное распределение — а ещё и среднее смещено в сторону нуля, т.к. более вероятны более маленькие числа.
Ваши рассуждения для большого числа верны только на «хвосте», потому что это число не делится на цело на 20. Если число достаточно большое, то вероятности будут очень близки.
Насчет неравномерности распределения вполне возможно, здесь я тонкостей реализации не знаю
Насчет неравномерности распределения вполне возможно, здесь я тонкостей реализации не знаю
Не, реализация тут ни при чём. Просто даже если предполагаем что rand() идеально равномерен — после взятия модуля получается некрасиво. Причём погрешность хоть и маленькая, но вполне ощутимая, потому что гарантированный RAND_MAX всего 32767, что не так уж и много. Поэтому при генерации чисел от 0 до 20 «хвост» будет смещать вероятности части исходов на 0.06%. Примерно на эту же величину будет смещено среднее — не из-за особенностей реализации rand(), а из-за взятия модуля.
А представьте что мы пытаемся выбрать случайным образом город из списка в 10000 городов (не знаю зачем, но допустим)? Тогда города с номерами, меньшими 2767, будут выпадать на 33% чаще чем остальные!
А представьте что мы пытаемся выбрать случайным образом город из списка в 10000 городов (не знаю зачем, но допустим)? Тогда города с номерами, меньшими 2767, будут выпадать на 33% чаще чем остальные!
Если вкратце, то вот ссылка: sdrv.ms/1e11LXl
Хотя, конечно, в контексте данной статьи она совсем не при чем, какая разница, если распределение у ответов будет не идеально равномерное?
Хотя, конечно, в контексте данной статьи она совсем не при чем, какая разница, если распределение у ответов будет не идеально равномерное?
А с чем может быть связана ситуация когда в pebble application эти watchapps посылаются на часы, но ни в самих часах, ни в «Watch Apps» списке они не появляются?
Обновление прошивки стоит последнее.
Обновление прошивки стоит последнее.
Цикл статей интересный и для меня лично актуален (новоиспеченный владелец). Если не сложно, хотелось бы увидеть в следующих уроках пример взаимодействия часов с почтовыми програмами, считывание количества новых сообщений от различных ящиков (яху, стандартное приложение Email и т.п.). Работа с смс, погодой от разных поставщиков.
Ой, было бы время. Я вот по общению с телефоном и интернетом не могу никак дописать. Еще есть про хранилище данных на часах и меню
Жду с нетерпением. Просто именно взаимодействие с телефоном первоочередная функция часов :)
Sign up to leave a comment.
Программируем под Pebble. Урок второй: Камешек, дающий ответы, игральные кости и секс-кубики