Небольшая проблема с математикой

sadman41
Offline
Зарегистрирован: 19.10.2016

qwone пишет:

sadman41 пишет:

Что же делать системам без EEPROM - просить пользователя на бумажке записывать последнее число, а потом вводить его при необходимости? Прямо какой-то сериал Lost.

Да блин, что вы за системы программируете. Еще скажите что, там нет millis(). Да хоть в дополнительной памяти для часов реального времени. Или их тоже нет.

Вы мне льстите. Какие системы я могу программировать, раз на random() посыпался. Чайник-то с трудом ставлю: никак мне могу запомнить - сначала газ, потом спичка или наоборот.

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

sadman41 пишет:

просить пользователя на бумажке записывать последнее число

Можно с утра звонить в пиндосское посольство и спрашивать, какой на сегодня код. 

sadman41
Offline
Зарегистрирован: 19.10.2016

DetSimen пишет:

sadman41 пишет:

просить пользователя на бумажке записывать последнее число

Можно с утра звонить в пиндосское посольство и спрашивать, какой на сегодня код. 

Хорошая идея. А я думал к курсу рубля привязаться...

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

DetSimen пишет:
Можно с утра звонить в пиндосское посольство и спрашивать, какой на сегодня код. 

Лучше спрашивать так какой сегодня день. Может не соврут. А то скажут Воскресенье, не приемный день. А так да в Понедельник вводить 1, во Вторник 2. 

nik182
Offline
Зарегистрирован: 04.05.2015

У интела встроенный аппаратный рандом генератор есть и апи к нему. В stm32f4 верхних серий тоже есть, так что даже под санкции о шифровании попадает. Всё остальное только analogRead(0) с открытого порта наводку из эфира один раз цифрануть и в сид засунуть с непонятными последствиями. 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Так чё там с распределением?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

sadman41 пишет:
сначала газ, потом спичка или наоборот.
Это что, я вот как-то в ступоре был: сначала напиться, а потом повеситься, или наоборот.

sadman41
Offline
Зарегистрирован: 19.10.2016

Кстати, про analogRead() и распределение.

Вот тут пишут, что он, как источник числа посева, так себе: https://hackaday.com/2018/01/08/entropy-and-the-arduino/ .  Предлагают воспользоваться джиттером тактовой МК (правда я не совсем понял, относительно чего он вычисляется и чем замеряется) или неинициализированной памятью - рандомайзом на фотонах: https://hackaday.com/2015/06/29/true-random-number-generator-for-a-true-hacker/

sadman41
Offline
Зарегистрирован: 19.10.2016

ЕвгенийП пишет:

sadman41 пишет:
сначала газ, потом спичка или наоборот.
Это что, я вот как-то в ступоре был: сначала напиться, а потом повеситься, или наоборот.

Я так понимаю, что всегда начинали с первого, а потом жизнь начинала казаться лучше?

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

sadman41 пишет:
сначала газ, потом спичка или наоборот.
Это что, я вот как-то в ступоре был: сначала напиться, а потом повеситься, или наоборот.

Вы меня пугаете...

andriano
andriano аватар
Онлайн
Зарегистрирован: 20.06.2015

ЕвгенийП пишет:

Настоящих случайных чисел в таких алгоритмах не бывает в принципе...

А вот и затравка для холивара!

является ли, скажем, число 123 Настоящим случайным числом?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Нет, никакого холивара не будет. По двум очень простым причинам: 1) я достаточно хорошо владею материалом и 2) у меня нет никакого желания доказывать кому либо, что он прав или не прав.

И да, 123 не является настоящим случайным числом. И 124 - тоже. Случайных чисел не бывает в принципе, как я уже имел случай сообщить. Случайные последовательности бывают, а случайных чисел не бывает (ну, разве что автомат пуха их в состоянии генерить при помощи лямда-функций).

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

sadman41 пишет:
из взаимоотношений честного и нечестного Си.

Всё-таки пример неудачен - там только честный.

Хотите простой пример разницы между честным и нечестным? Примерчик правда уже с баянистой бородой, но если кто случайно не видел, то прикольно.

Итак, пишем одну и ту же коротенькую функцию на Си и на С++ и запускаем обе. Для этого в одной папке кладём два файла:

Файл duck.c

int multiple_c(const int n) {
	return n * sizeof('a');
}

Файл xxx.ino

extern "C" int multiple_c(const int);

int multiple_cpp(const int n) { 
	return n * sizeof('a');
}

void setup(void) {
	Serial.begin(57600);
	Serial.print("From C: ");
	Serial.println(multiple_c(23));
	Serial.print("From C++: ");
	Serial.println(multiple_cpp(23));
}

void loop(void) {}

Как видите, функции идентичны. Только одна на С, а другая (та, что в .ino) на С++.

Теперь запускаем и смотрим результат

andriano
andriano аватар
Онлайн
Зарегистрирован: 20.06.2015

Что-то  смутно припоминаю, что в Си char может принимать не менее 257 различных значений.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Да, нет, char - он и в Африке char, просто в Си костанта вроде 'a' является int'ом, а на char'ом (если говорить строже - всегда расширяется до int'а, если используется не в контексте char). Фокус основан на этом.

brokly
brokly аватар
Онлайн
Зарегистрирован: 08.02.2014

А если поменять на русскую 'a' что то изменится ? :)

andriano
andriano аватар
Онлайн
Зарегистрирован: 20.06.2015

Да, перепутал: в К&R речь шла не о типе char, а о функции getchar.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

brokly пишет:

А если поменять на русскую 'a' что то изменится ? :)

Попробуйте.

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

Случайных чисел не бывает в принципе, как я уже имел случай сообщить.

Видимо поэтому приятель с пеной у рта доказывал мне, что выиграть в рулетку невозможно...ссылался при этом на какие-то математические формулы и, мои возвражения типа...а если играть стрит на 4 улицы...а если делать ставки только при вбросе шарика к примеру при вращении по часовой стрелке...мои доводы о пятиразовом смене крупье его не убедили )))
Но тема рандома не раскрыта, к примеру рандом от 1 до 49 ...

sadman41
Offline
Зарегистрирован: 19.10.2016

При random(49) и сиде с аналогрида (или любом, меньшем либо равном 16807) в Wiring первый раз всегда выигрывает казино.

sadman41
Offline
Зарегистрирован: 19.10.2016

ЕвгенийП пишет:

sadman41 пишет:
из взаимоотношений честного и нечестного Си.

Всё-таки пример неудачен - там только честный.

Описание, скорее, не сильно продуманное - педагогического опыта не имею. 

"Честный/нечестный" я всегда считал местным мемом, рождённым Онкелем, который доказывает, что Си честней Wiring-а на 146%

Green
Онлайн
Зарегистрирован: 01.10.2015

brokly пишет:

А если поменять на русскую 'a' что то изменится ? :)


Смотря в какой кодировке. Для UTF-8 результат будет одинаков.

Green
Онлайн
Зарегистрирован: 01.10.2015

sadman41 пишет:

"Честный/нечестный" я всегда считал местным мемом, рождённым Онкелем, который доказывает, что Си честней Wiring-а на 146%


Как минимум.)

b707
Offline
Зарегистрирован: 26.05.2017

sadman41 пишет:

При random(49) и сиде с аналогрида (или любом, меньшем либо равном 16807) в Wiring первый раз всегда выигрывает казино.

у тебя в коде сид должен быть не меньше 127773

Я тебе еще вчера предложил - домножать сид на это или близкое число - все будет работать правильно.

sadman41
Offline
Зарегистрирован: 19.10.2016

Почему вы считаете, что этот код мой и я его написал так, что он будет работать неправильно? Я воспользовался стандартным функционалом в соответствии с "руководством по эксплуатации". Обнаружил проблему, причину и рассказал. Это была моя единственная цель.

Костылей наделать - не вопрос, я тебе уже об этом писал.

b707
Offline
Зарегистрирован: 26.05.2017

sadman41 пишет:

Почему вы считаете, что этот код мой и я его написал так

да не обижайся ты.  Пишу "у тебя в коде" в том смысле, что ты его выложил.

Мое замечание касалось лишь твоего сообщения #70:

>>> При сиде с аналогрида (или любом, меньшем либо равном 16807)

=== не 16807, а 127773 ! - все

 

ЗЫ А вообще, информация очень полезная. Сам всегда пользовался АналогРидом для сида, теперь буду знать, что это туфта.