отнюдь, т.к. требует определенных усилий по контролю за выключением питания. мой метод не зависит ни от чего "внешнего".OKF писал(а):Наиболее просто.
Вопросы по С/С++ (СИ)
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18561
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Реклама
Re: Вопросы по С/С++ (СИ)
По включению читаем значение seed, получаем новое, сохраняем. Контроль за питанием зачем?
Re: Вопросы по С/С++ (СИ)
Чтобы при сохранении не "записать" туда FF.
Re: Вопросы по С/С++ (СИ)
4 мс? И даже если FF - тоже элемент случайности.)
Re: Вопросы по С/С++ (СИ)
Ну это от случая конкретного применения зависит и для чего рандом применяется в общем.
- Реклама
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18561
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Не знаю, как в теории, а на практике все мои попытки получить непредсказуемое состояние при подаче питания были неудачны, пока я не применил описанный ранее алгоритм. А пробовал я и таймер, и WDT, и АЦП... И стандартные функции... Если говорить о avr-gcc, то rand и srand в любых комбинациях там дают очень быстро узнаваемую последовательность...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Вопросы по С/С++ (СИ)
Всем доброго дня коллеги.
Только начал знакомство с языком Си. Есть вопросы. Вот прога, в среде Visual Studio:

Пытаюсь получить ввод этого самого конца файла, что бы вывести в консоль надпись "end file", и только после нажатия Ctrl + z, а потом нажатия клавиши Enter, получается вызвать конец файла и сообщения "end file". Простым нажатием Ctrl + z, ничего не выходит.
Так и должно быть? И при чем тут Enter ?
Только начал знакомство с языком Си. Есть вопросы. Вот прога, в среде Visual Studio:
Пытаюсь получить ввод этого самого конца файла, что бы вывести в консоль надпись "end file", и только после нажатия Ctrl + z, а потом нажатия клавиши Enter, получается вызвать конец файла и сообщения "end file". Простым нажатием Ctrl + z, ничего не выходит.
Так и должно быть? И при чем тут Enter ?
Re: Вопросы по С/С++ (СИ)
[uquote="ARV",url="/forum/viewtopic.php?p=3960645#p3960645"]Не знаю, как в теории, а на практике все мои попытки получить непредсказуемое состояние при подаче питания были неудачны, пока я не применил описанный ранее алгоритм. А пробовал я и таймер, и WDT, и АЦП...[/uquote]
Я вон там свои экзерциссы с генерацией случайных чисел подручными способами описывал. Вполне годно получалось.
Я вон там свои экзерциссы с генерацией случайных чисел подручными способами описывал. Вполне годно получалось.
Re: Вопросы по С/С++ (СИ)
Что-то я затупил... есть конструкция do{.....} while(0); если внутри конструкции выполняется continue - цикл повторится или как? у меня он не повторяется почему-то
В отладчике вижу, что possible_walls имеет значение 0x000000AA и последний if даёт 1, но следущим шагом я оказываюсь вне цикла. что я не понимаю?
Код: Выделить всё
do {
update_coordinate(&possible_destination, possible_bearing);
possible_walls = maze[possible_destination.north*maxX + possible_destination.east];
if ((possible_walls & 0x0f) != ((possible_walls & 0xf0)>>4)) return 0; // мы в этой ячейке еще точно не были - надо посетить
if ((possible_walls == 0xaa) || (possible_walls == 0x55)) continue; // если попали в "туннель" повторяем движение.
} while(0);А люди посмотрят и скажут: "Собаки летят. Вот и осень."
-
BlackKilkennyCat
- Собутыльник Кота
- Сообщения: 2905
- Зарегистрирован: Ср ноя 29, 2017 06:58:50
Re: Вопросы по С/С++ (СИ)
continue перепрыгивает в начало цикла, проверки условия для новой итерации, а там 0, значит, условие не выполняется, выход из цикла.
Код: Выделить всё
do {
update_coordinate(&possible_destination, possible_bearing);
possible_walls = maze[possible_destination.north*maxX + possible_destination.east];
} while (!((possible_walls & 0x0f) != ((possible_walls & 0xf0)>>4)));
return 0; Re: Вопросы по С/С++ (СИ)
Хм, я надеялся, что условие цикла проверяться не будет... ну ладно, напишем иначе.
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18561
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
если требуется случайное число для "бытовых" целей, то и штатный rand с предустановкой по моему методу вполне приемлем. у вас, очевидно, цели были совсем иные...a5021 писал(а):Вполне годно получалось.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Вопросы по С/С++ (СИ)
Угу. К - конспирология.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18561
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
может быть, П - паранойя?a5021 писал(а):К - конспирология
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Serzh2000
- Опытный кот
- Сообщения: 867
- Зарегистрирован: Пт фев 27, 2015 12:00:53
- Откуда: Рязанская область
Re: Вопросы по С/С++ (СИ)
чтобы rand() не работал при каждом включении одинаково я понял, Спасибо!!!
у меня еще вопрос в котором запутался и увяз по уши ...
есть в мигалки эффекты, чтобы они случайным образом выбирались применил rand()%29
ВОПРОС: как сделать чтобы все 29 эффектов от мигали в случайном порядке НЕ повторяясь.
может флаги наделать или перемешивать их как то ...
switch(rand()%29)
{
case 0:
view_flasher_0();
break;
case 1:
view_flasher_1();
break;
case 2:
view_flasher_2();
break;
case 3:
view_flasher_3();
break;
...
case 28:
view_flasher_28();
break;
}
у меня еще вопрос в котором запутался и увяз по уши ...
есть в мигалки эффекты, чтобы они случайным образом выбирались применил rand()%29
ВОПРОС: как сделать чтобы все 29 эффектов от мигали в случайном порядке НЕ повторяясь.
может флаги наделать или перемешивать их как то ...
Спойлер
while (1) {switch(rand()%29)
{
case 0:
view_flasher_0();
break;
case 1:
view_flasher_1();
break;
case 2:
view_flasher_2();
break;
case 3:
view_flasher_3();
break;
...
case 28:
view_flasher_28();
break;
}
Последний раз редактировалось Serzh2000 Вт янв 19, 2021 07:30:27, всего редактировалось 2 раза.
Re: Вопросы по С/С++ (СИ)
Serzh2000, именно. Только или флагами отмечать, что эффект уже "был" или же создать массив и перемешать его в произвольном порядке.
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Для справочки.
[uquote="Serzh2000",url="/forum/viewtopic.php?p=3962486#p3962486"]switch(rand()%28)
{
case 28:
view_flasher_28();
break;
}[/uquote]
case 28: не выполнится никогда. Выражение %28 никогда не даст результат 28.
[uquote="Serzh2000",url="/forum/viewtopic.php?p=3962486#p3962486"]switch(rand()%28)
{
case 28:
view_flasher_28();
break;
}[/uquote]
case 28: не выполнится никогда. Выражение %28 никогда не даст результат 28.
- Serzh2000
- Опытный кот
- Сообщения: 867
- Зарегистрирован: Пт фев 27, 2015 12:00:53
- Откуда: Рязанская область
Re: Вопросы по С/С++ (СИ)
если флагами то наверно когда будет оставаться один или два не отмеченных эффекта то их порядковый номер можно долго ждать пока выпадет случайно... а как массивом у меня не получается

точно, спасибо упустил из видуcase 28: не выполнится никогда. Выражение %28 никогда не даст результат 28.
Re: Вопросы по С/С++ (СИ)
Serzh2000,
Сначала думал написать быстренько простенькую перемешку самостоятельно, но потом решил загуглить: https://stackoverflow.com/questions/612 ... array-in-c
Ну или вот вариант 2, который без malloc() только: http://rosettacode.org/wiki/Knuth_shuffle#C
Код: Выделить всё
#include <stdlib.h>
#define MAX 29
uint8_t arr[MAX] = {1, 2, 3, ... };
/* Arrange the N elements of ARRAY in random order.
Only effective if N is much smaller than RAND_MAX;
if this may not be the case, use a better random
number generator. */
void shuffle(uint8_t *array, size_t n)
{
if (n > 1)
{
size_t i;
for (i = 0; i < n - 1; i++)
{
size_t j = i + rand() / (RAND_MAX / (n - i) + 1);
uint8_t t = array[j];
array[j] = array[i];
array[i] = t;
}
}
}
...
while(1) {
srand(...);
shuffle(&arr, sizeof(arr));
for(uint8_t i = 0, i++, i <= MAX {
effect(arr[i]);
}
}
Ну или вот вариант 2, который без malloc() только: http://rosettacode.org/wiki/Knuth_shuffle#C
Последний раз редактировалось NStorm Пн янв 18, 2021 19:52:48, всего редактировалось 1 раз.
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
[uquote="Serzh2000",url="/forum/viewtopic.php?p=3962516#p3962516"]а как массивом у меня не получается[/uquote]
Как то примерно так
Только, в Вашем случае, нужно создавать массив указателей на функции и его перемешивать.
Код: Выделить всё
uint8_t rnd_arr[29];
for(int i=0; i<29; i++){
rnd_arr[i]=i;
}
for(int i=0; i<100; i++){
uint8_t a = rand()%29;
uint8_t b = rand()%29;
swap(&rnd_arr[a], &rnd_arr[b]);
}
Только, в Вашем случае, нужно создавать массив указателей на функции и его перемешивать.


