Как стать автором
Обновить

Комментарии 28

Ну и
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
НЛО прилетело и опубликовало эту надпись здесь
А какая разница? Лишь бы не
isOddNumber(i).toString().length() < 5
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, так что это недоступно
что-то я не понят про пункт 4, можно поподробнее? это все же остаток от деления, а не его результат. Грубо говоря, это группа вычетов, поэтому при равномерном распределении все будет от 0 до 19
Для простоты рассмотрим более простой пример (вывод будет верен и для исходного, просто числа другие). Пусть rand() равновероятно возвращает число от 0 до 15. А у нас есть 10 поз с номерами от 0 до 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% чаще чем остальные!
Ну, для такого приложения, как здесь, 0,06% — это приемлемо :) а для общего случая, разумеется, это не вариант, и надо иметь ввиду.

Добавим в кучку к таким примерам, как подсчет среднего значения, что нельзя просто посчитать сумму и поделить пополам. Спасибо за пояснения!
Если вкратце, то вот ссылка: sdrv.ms/1e11LXl

Хотя, конечно, в контексте данной статьи она совсем не при чем, какая разница, если распределение у ответов будет не идеально равномерное?
Это будет ужасно! Одни позы будут встречаться чаще других!
и это, кстати, можно использовать в своих интересах!
А с чем может быть связана ситуация когда в pebble application эти watchapps посылаются на часы, но ни в самих часах, ни в «Watch Apps» списке они не появляются?
Обновление прошивки стоит последнее.
Ну вот такое поведение я видел только когда была несовместимость версий прошивки/программы на телефоне и приложения для часов. Последнее — это 1.13 или 2.0?
1.13, да… а как на 2.0 перейти? официальное приложение не дает таких опций.
Вот тут описано, раздел Flashing your Pebble with a Beta firmware.
Кратко — поставить вот это приложение, и открыть в нем вот эту прошивку, если в серийнике нет Q, и вот эту, если есть.
Спасибо!
Цикл статей интересный и для меня лично актуален (новоиспеченный владелец). Если не сложно, хотелось бы увидеть в следующих уроках пример взаимодействия часов с почтовыми програмами, считывание количества новых сообщений от различных ящиков (яху, стандартное приложение Email и т.п.). Работа с смс, погодой от разных поставщиков.
Ой, было бы время. Я вот по общению с телефоном и интернетом не могу никак дописать. Еще есть про хранилище данных на часах и меню
Жду с нетерпением. Просто именно взаимодействие с телефоном первоочередная функция часов :)
Там замороченная система, я матерился на разработчиков, когда раскуривал. Причем нигде полностью не описана, предполагается, что читающий знает логику взаимодействия. Вот с логикой как раз и самая большая проблема.
Зарегистрируйтесь на Хабре , чтобы оставить комментарий