Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить

Re: Вопросы по С/С++ (СИ)

Пт янв 15, 2021 07:53:11

OKF писал(а):Наиболее просто.
отнюдь, т.к. требует определенных усилий по контролю за выключением питания. мой метод не зависит ни от чего "внешнего".

Re: Вопросы по С/С++ (СИ)

Пт янв 15, 2021 09:50:56

По включению читаем значение seed, получаем новое, сохраняем. Контроль за питанием зачем?

Re: Вопросы по С/С++ (СИ)

Пт янв 15, 2021 10:21:17

Чтобы при сохранении не "записать" туда FF.

Re: Вопросы по С/С++ (СИ)

Пт янв 15, 2021 10:27:59

4 мс? И даже если FF - тоже элемент случайности.)

Re: Вопросы по С/С++ (СИ)

Пт янв 15, 2021 10:57:55

Ну это от случая конкретного применения зависит и для чего рандом применяется в общем.

Re: Вопросы по С/С++ (СИ)

Пт янв 15, 2021 21:30:27

Не знаю, как в теории, а на практике все мои попытки получить непредсказуемое состояние при подаче питания были неудачны, пока я не применил описанный ранее алгоритм. А пробовал я и таймер, и WDT, и АЦП... И стандартные функции... Если говорить о avr-gcc, то rand и srand в любых комбинациях там дают очень быстро узнаваемую последовательность...

Re: Вопросы по С/С++ (СИ)

Сб янв 16, 2021 18:04:03

Всем доброго дня коллеги.
Только начал знакомство с языком Си. Есть вопросы. Вот прога, в среде Visual Studio:
Изображение
Пытаюсь получить ввод этого самого конца файла, что бы вывести в консоль надпись "end file", и только после нажатия Ctrl + z, а потом нажатия клавиши Enter, получается вызвать конец файла и сообщения "end file". Простым нажатием Ctrl + z, ничего не выходит.
Так и должно быть? И при чем тут Enter ?

Re: Вопросы по С/С++ (СИ)

Сб янв 16, 2021 19:54:10

Не знаю, как в теории, а на практике все мои попытки получить непредсказуемое состояние при подаче питания были неудачны, пока я не применил описанный ранее алгоритм. А пробовал я и таймер, и WDT, и АЦП...

Я вон там свои экзерциссы с генерацией случайных чисел подручными способами описывал. Вполне годно получалось.

Re: Вопросы по С/С++ (СИ)

Вс янв 17, 2021 09:16:58

Что-то я затупил... есть конструкция do{.....} while(0); если внутри конструкции выполняется continue - цикл повторится или как? у меня он не повторяется почему-то

Код:
    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);


В отладчике вижу, что possible_walls имеет значение 0x000000AA и последний if даёт 1, но следущим шагом я оказываюсь вне цикла. что я не понимаю?

Re: Вопросы по С/С++ (СИ)

Вс янв 17, 2021 09:30:06

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: Вопросы по С/С++ (СИ)

Вс янв 17, 2021 09:39:27

Хм, я надеялся, что условие цикла проверяться не будет... ну ладно, напишем иначе.

Re: Вопросы по С/С++ (СИ)

Вс янв 17, 2021 14:17:34

a5021 писал(а):Вполне годно получалось.
если требуется случайное число для "бытовых" целей, то и штатный rand с предустановкой по моему методу вполне приемлем. у вас, очевидно, цели были совсем иные...

Re: Вопросы по С/С++ (СИ)

Вс янв 17, 2021 20:50:33

Угу. К - конспирология.

Re: Вопросы по С/С++ (СИ)

Пн янв 18, 2021 08:41:04

a5021 писал(а):К - конспирология
может быть, П - паранойя? ;) :)))

Re: Вопросы по С/С++ (СИ)

Пн янв 18, 2021 19:15:52

чтобы rand() не работал при каждом включении одинаково я понял, Спасибо!!! :beer:

у меня еще вопрос в котором запутался и увяз по уши ... :facepalm:

есть в мигалки эффекты, чтобы они случайным образом выбирались применил rand()%29 8)
ВОПРОС: как сделать чтобы все 29 эффектов от мигали в случайном порядке НЕ повторяясь.
может флаги наделать или перемешивать их как то ... :facepalm:

Последний раз редактировалось Serzh2000 Вт янв 19, 2021 07:30:27, всего редактировалось 2 раз(а).

Re: Вопросы по С/С++ (СИ)

Пн янв 18, 2021 19:23:02

Serzh2000, именно. Только или флагами отмечать, что эффект уже "был" или же создать массив и перемешать его в произвольном порядке.

Re: Вопросы по С/С++ (СИ)

Пн янв 18, 2021 19:29:59

Для справочки.

switch(rand()%28)
{

case 28:
view_flasher_28();
break;

}

case 28: не выполнится никогда. Выражение %28 никогда не даст результат 28.

Re: Вопросы по С/С++ (СИ)

Пн янв 18, 2021 19:31:46

если флагами то наверно когда будет оставаться один или два не отмеченных эффекта то их порядковый номер можно долго ждать пока выпадет случайно... а как массивом у меня не получается

case 28: не выполнится никогда. Выражение %28 никогда не даст результат 28.


точно, спасибо упустил из виду :beer:

Re: Вопросы по С/С++ (СИ)

Пн янв 18, 2021 19:51:09

Serzh2000,
Код:
#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]);
  }
}


Сначала думал написать быстренько простенькую перемешку самостоятельно, но потом решил загуглить: https://stackoverflow.com/questions/612 ... array-in-c
Ну или вот вариант 2, который без malloc() только: http://rosettacode.org/wiki/Knuth_shuffle#C
Последний раз редактировалось NStorm Пн янв 18, 2021 19:52:48, всего редактировалось 1 раз.

Re: Вопросы по С/С++ (СИ)

Пн янв 18, 2021 19:52:32

а как массивом у меня не получается

Код:

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]);
}

Как то примерно так :roll:

Только, в Вашем случае, нужно создавать массив указателей на функции и его перемешивать.
Ответить