Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
0 / 0 / 0
Регистрация: 27.04.2016
Сообщений: 43

Функция rand()

26.07.2020, 13:42. Показов 3312. Ответов 42
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
День добрый, у меня вот такое задание, многомерный массив [4][4] заполнить числами либо 0 либо 1, потом вывести все квадратом, и проверить если есть 0 который окружен со всех сторон единицами, свверху, снизу, слева справа, и побокам сверху и снизу, если такой 0 найден, то программа должна вывести индекс нуля в многомерном массиве
Например в многомерном массиве
0 1 1 0
1 1 1 1
1 0 1 0
1 1 1 0
Должно вывести
(0,0)
(0,3)
(2,1)
Всё это я сделал и думаю могу сдать задание но в моем решении меня кое что не устраивает
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include<stdio.h>
#include <stdlib.h>
#include <time.h>
 
int main()
{
    int arr[4][4];
    int arr2[4], arr3[4];
    int i, j, num=0;
    
    time_t t; 
srand(time(&t));
    for(i=0; i<4; i++)
    {
        for(j=0;j<4;j++)
       { arr[i][j]= rand()%2;}
        
    }
    for(i=0; i<4; i++)
    
    { 
        for(j=0;j<4;j++)
       {if(arr[i][j]>1 || arr[i][j]<0)
        
        {printf("matrix is not binnary\n");
             return 0;}
            }
        }
    
    
    for(i=0; i<4; i++)
    {
        for(j=0;j<4; j++)
        {if(arr[i][j]==0 && arr[i][j+1]!=0 && arr[i][j-1]!=0 && arr[i+1][j]!=0 && arr[i-1][j]!=0  && arr[i+1][j+1]!=0 &&  arr[i][j-1]!=0 && arr[i-1][j+1]!=0 &&arr[i-1][j-1]!=0)
        
       {arr2[num]=i;
        arr3[num]=j;
        num++;}}
        
         
    }
    printf("%d\n", num);
    for(i=0;i<4; i++)
    {  printf("|");
        for(j=0;j<4;j++)
        {printf("%d| ", arr[i][j]);
    }
    printf("\n");}
    printf("the matrix is binarry\n");
    for(i=0; i<num; i++)
    printf("(%d,%d)\n", arr2[i], arr3[i]);
}
Во первых, есть вариант что бы сделать if короче? во вторых функция rand() кидает нужный мне 0 окружённый единицами только в двух одинаковых местах, либо это(0,0), либо (3,0), мин 20 проверял, либо нет такого нуля, либо есть, но только в одном из этих двух мест, хотелось бы узнать почему только туда, а не хотя бы в угол (0,3)или угол (3,3)? Ведь там столько же шансов получить такую же комбинацию как и в уже выводимых вариантах
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.07.2020, 13:42
Ответы с готовыми решениями:

Функция rand()
Здравствуйте. Написал функцию, которая генерирует случайное число от 1 до 5 и возвращает его в main. Однако, в цикле for переменная b(она...

Функция rand
Необходимо вывести случайное число от -5 до 15 с помощью функции rand

Не работает функция rand()?
Делаю игру &quot;морской бой&quot;, в функции стрельбы ИИ возникла проблема: если происходит попадение, то дожно рандомно выбрать сторону и стрелять,...

42
6 / 6 / 4
Регистрация: 14.01.2016
Сообщений: 164
28.07.2020, 12:24
Студворк — интернет-сервис помощи студентам
Annemesski, либо я вас не понял, либо вы меня. Я не спрашивал для чего нужна функция srand. Меня интересует для чего были применены приведение типа (unsigned int) и деление /2 при вызове этой функции.
0
 Аватар для Annemesski
2692 / 1349 / 485
Регистрация: 08.11.2016
Сообщений: 3,739
28.07.2020, 12:33
asbvic, это Вас Мама Стифлера приколол
Цитата Сообщение от мама Стифлера Посмотреть сообщение
хотя тоже не понимаю зачем так написал
приведение типа к unsigned чтобы не выслушивать ворчание (warning) компилятора, так как он сообщит о несоответствии типов unsigned int который принимает функция rand() и time_t которое на самом деле long long int которое возвращает функция time() то есть компилятор будет говорить о signed/unsigned mismatch.

Зачем он делит на 2? Ну вот, душа у человека широкая и загадочная, не судите его за это )))
1
из племени тумба-юбма
 Аватар для мама Стифлера
2523 / 1819 / 419
Регистрация: 29.11.2015
Сообщений: 8,857
Записей в блоге: 15
28.07.2020, 12:45
Цитата Сообщение от Annemesski Посмотреть сообщение
так как он сообщит о несоответствии типов unsigned int который принимает функция rand() и time_t
фиг знает, у меня не нет warning по этому поводу, хотя выставлены опции компиляции, чтоб предупреждал про всякую мелочь
0
 Аватар для Annemesski
2692 / 1349 / 485
Регистрация: 08.11.2016
Сообщений: 3,739
28.07.2020, 13:00
мама Стифлера, чуток попутал, там не signed/unsigned mismatch, а conversion from _Ty1 to _Ty2: possible loss of data - возможна потеря данных при конвертации типов, поскольку time_t это long long - 64 бита, а unsigned int может быть и 32.

Цитата Сообщение от мама Стифлера Посмотреть сообщение
у меня не нет warning по этому поводу
C
1
#pragma warning (once : 4244)
добавьте
0
6 / 6 / 4
Регистрация: 14.01.2016
Сообщений: 164
28.07.2020, 13:02
Цитата Сообщение от Annemesski Посмотреть сообщение
это Вас Мама Стифлера приколол
мама Стифлера здесь не при чем, не он же автор кода.
Цитата Сообщение от Annemesski Посмотреть сообщение
Зачем он делит на 2? Ну вот, душа у человека широкая и загадочная, не судите его за это )))
Суть в том что не только здесь так написали. Даже в справочнике Шилдта так же написано:
C
1
2
3
4
5
6
7
int i, stime;
long ltime;
 
/* получает текущее календарное время */
ltime = time(NULL);
stime = (unsigned) ltime/2;
srand(stime);
То есть явно есть какой-то смысл.
0
из племени тумба-юбма
 Аватар для мама Стифлера
2523 / 1819 / 419
Регистрация: 29.11.2015
Сообщений: 8,857
Записей в блоге: 15
28.07.2020, 13:12
Цитата Сообщение от asbvic Посмотреть сообщение
То есть явно есть какой-то смысл
да, тоже интересно зачем так.
0
6 / 6 / 4
Регистрация: 14.01.2016
Сообщений: 164
28.07.2020, 13:16
У меня лишь есть предположение, что на некоторых системах число, возвращаемое функцией time, всегда четное. Из-за этого будет выпадать половина возможных цепочек псевдослучайных чисел. И за счет деления это исключают.
0
из племени тумба-юбма
 Аватар для мама Стифлера
2523 / 1819 / 419
Регистрация: 29.11.2015
Сообщений: 8,857
Записей в блоге: 15
28.07.2020, 13:20
Да пусть stake-k26 сам скажет, если конечно захочет
0
 Аватар для Annemesski
2692 / 1349 / 485
Регистрация: 08.11.2016
Сообщений: 3,739
28.07.2020, 13:22
Цитата Сообщение от asbvic Посмотреть сообщение
То есть явно есть какой-то смысл.
Смысл только один: запутать потенциального взломщика который знает алгоритм генерации и может узнать текущее системное время и, как следствие, вычислить значения предоставляемые ГПСЧ, но вот это деление на 2 такое себе запутывание, в системах (программах) где ГПСЧ обеспечивает криптостойкость шифров, которая напрямую зависит от того насколько выдаваемые генератором значения близки к истинно случайным, прибегают к более серьезным ухищрениям. Например берут текущее значение атмосферного давления или температуры воздуха, силы ветра и прочих "природных/погодных" параметров которые также не являются истинно случайными, но зато являются "трудно предсказуемыми".
0
2493 / 1157 / 709
Регистрация: 25.04.2016
Сообщений: 3,339
28.07.2020, 13:30
Цитата Сообщение от asbvic Посмотреть сообщение
Материалы по ссылкам, которые вы дали, не дают ответа.
Цитата Сообщение от Annemesski Посмотреть сообщение
Зачем он делит на 2? Ну вот, душа у человека широкая и загадочная
Материалы по ссылкам как раз-таки дают исчерпывающий ответ.

Функция srand() определена в stdlib.h и ее прототип выглядит как:
void srand (unsigned int __seed);

нас из этого интересует только тип данных аргумента __seed, и он, как видно из прототипа unsigned int

теперь смотрим на функцию time(), прототип которой скрывается в недрах time.h:
time_t time (time_t *__timer);

И снова, нас интересует только тип данных, возвращаемых функцией, и он у нас time_t

Ну а теперь нам осталось совсем немного для обретения полного дзена:
C
1
2
3
4
5
6
7
8
9
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
 
int main (void) {
    printf("%ld - %ld\n", sizeof(unsigned int), sizeof(time_t));
    printf("%ld - %ld\n", sizeof(unsigned int), sizeof(time_t)/2);
    return 0;
}
gcc file.c -o 10 -Wall -Werror && strip -s 10 && ./10
4 - 8
4 - 4

Как мы видим из вывода нашей тестовой программы, time_t вдвое больше unsigned int. И при конвертировании в unsigned int он будет урезан вдвое, а зачем его урезать, если можно просто разделить на 2 и получить по сути тот же самый __seed, который легко поместится в unsigned int?

Конечно же, реализация типов данных отличается на разных платформах, и стандарт вовсе не гарантирует, что time_t всегда будет вдвое больше, тем не менее на большинстве платформ эта ситуация сохраняется. И да, некоторые компиляторы сыпят ошибкам при отсутствии явного приведения типа.

Так что мне проще написать чуть более длинную строчку для srand и навсегда забыть о разнице платформ, разнице реализаций стандарта и капризах разных компиляторов.

Никаких широких и тем более загадочных душ - простой прагматизм.
1
из племени тумба-юбма
 Аватар для мама Стифлера
2523 / 1819 / 419
Регистрация: 29.11.2015
Сообщений: 8,857
Записей в блоге: 15
28.07.2020, 13:35
Цитата Сообщение от Annemesski Посмотреть сообщение
#pragma warning (once : 4244) добавьте
[Warning] ignoring #pragma warn [-Wunknown-pragmas]
0
 Аватар для Annemesski
2692 / 1349 / 485
Регистрация: 08.11.2016
Сообщений: 3,739
28.07.2020, 13:42
Цитата Сообщение от stake-k26 Посмотреть сообщение
И при конвертировании в unsigned int он будет урезан вдвое, а зачем его урезать, если можно просто разделить на 2 и получить по сути тот же самый __seed, который легко поместится в unsigned int?
Вы хотите сказать что деление числа на 2 сократит его двоичное представление вдвое? То есть типа если я число 12 (1100) разделю на два, то получу не 6 (110), а что то из набора (00; 01; 10; 11), так что ли?

Добавлено через 1 минуту
мама Стифлера, думал у Вас студия, тогда гуглите как в вашей IDE включить этот варнинг.
0
6 / 6 / 4
Регистрация: 14.01.2016
Сообщений: 164
28.07.2020, 14:10
Annemesski, в любом случае спасибо за ответ, но к сожалению это не убедительно. Уж очень "смешная" защита получается, тем более когда большинство именно так и делают (по крайней мере советуют так делать). В таком случае совсем не сложно сделать так:
C
1
2
srand((unsigned) time(NULL));
srand((unsigned) clock() ^ rand());
Вот в этом случае защита чувствуется.
Пока мне кажется что деление на два делается не для защиты.
Annemesski, вы можете сослаться на какой-нибудь доверительный источник, чтобы хоть как-то в этом убедиться?

Добавлено через 3 минуты
Цитата Сообщение от Annemesski Посмотреть сообщение
Вы хотите сказать что деление числа на 2 сократит его двоичное представление вдвое? То есть типа если я число 12 (1100) разделю на два, то получу не 6 (110), а что то из набора (00; 01; 10; 11), так что ли?
Тоже присоединяюсь. Совсем не понял stake-k26 в его сообщении. )

Добавлено через 8 минут
Annemesski, в случае деления на два защита даже ухудшается - повышается шанс перехватить нужное число, выражающее время (ведь частота смены этого числа снижается вдвое). (Если конечно я все правильно понимаю.)
0
 Аватар для Annemesski
2692 / 1349 / 485
Регистрация: 08.11.2016
Сообщений: 3,739
28.07.2020, 14:16
asbvic, тут скорее вопрос к источникам в которых производят это деление, я вот напротив таких не встречал, всегда видел использование вида
C
1
srand(time(NULL));
даже без заморочек с приведением типов которое станет актуально лет эдак через 40 - 50, когда количество значащих бит перевалит за 31, да и то, неявное преобразование типов это дело прожует, пусть полученное значение может оказаться не равно таймеру, результат - рандомизация значений от запуска к запуску или от вызова к вызову - будет достигнут, все остальное от лукавого.
0
6 / 6 / 4
Регистрация: 14.01.2016
Сообщений: 164
28.07.2020, 14:32
Наверно по качеству защиты будет тоже самое (что я писал выше):
C
1
srand((unsigned) time(NULL) ^ (unsigned) clock());
Добавлено через 5 минут
Цитата Сообщение от Annemesski Посмотреть сообщение
я вот напротив таких не встречал
Но, как я уже писал, даже в справочнике Шилдта пример именно так и приводится. Для меня справочник Шилдта весьма доверительный источник, почти на ровне с книгой K&R. Скорее всего мы чего-то не знаем (мне так кажется).

Добавлено через 7 минут

Не по теме:


Цитата Сообщение от Annemesski Посмотреть сообщение
которые также не являются истинно случайными
Annemesski, а "истинно случайные" это какие? )

0
 Аватар для Annemesski
2692 / 1349 / 485
Регистрация: 08.11.2016
Сообщений: 3,739
28.07.2020, 14:44
asbvic, с точки зрения безопасности srand()/rand() в голом виде вообще смешно использовать, они годятся разве что для учебных поделок, генерации тестировочных данных или для реализации собственных генераторов с преферансом и куртизанками.

Истинно случайные по ходу дела только там где бессилен демон Лапласса, то есть в квантово-механических процессах.
1
6 / 6 / 4
Регистрация: 14.01.2016
Сообщений: 164
28.07.2020, 15:00

Не по теме:


Цитата Сообщение от Annemesski Посмотреть сообщение
Истинно случайные по ходу дела только там где бессилен демон Лапласса, то есть в квантово-механических процессах.
Что является гипотезой. То есть на практике применение термина "истинно случайный" бессмысленно. )



Добавлено через 3 минуты
Цитата Сообщение от Annemesski Посмотреть сообщение
srand()/rand() в голом виде вообще смешно использовать
Вы имели в виду, что "смешно" использовать сами функции (т. е. нужно использовать другие инструменты)?
0
 Аватар для Annemesski
2692 / 1349 / 485
Регистрация: 08.11.2016
Сообщений: 3,739
28.07.2020, 15:24

Не по теме:

asbvic, нет, это не гипотеза, классический пример: если возмем монетку и будем ее подбрасывать, то подразумевается что шанс аверса или реверса 1/2, но так как идеальной монеты не существует, то как бы мы не вымеряли ее баланс и условия подбрасывания (скажем в вакууме) то ни баланс ни вакуум в идеале не достижимы, а значит мы можем только приближаться к вероятности 1/2 но достигнуть ее увы не удастся. С другой стороны, если мы возмем квантовую систему, скажем из двух спутанных фотонов проекции спинов которых строго противоположны, то, в виду того что для них строго соблюдается закон сохранения пространственной четности, если мы будем измерять проекцию спина одного из спутанных фотонов, то он окажется "правым" или "левым" с вероятностью 1/2 точно, этот и подобные этому принципы используются в аппаратных генераторах случайных чисел



Добавлено через 6 минут
Цитата Сообщение от asbvic Посмотреть сообщение
(т. е. нужно использовать другие инструменты)?
именно так, либо уже существующие, либо писать свои.
0
28.07.2020, 15:28

Не по теме:


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

Цитата Сообщение от Annemesski Посмотреть сообщение
этот и подобные этому принципы используются в аппаратных генераторах случайных чисел
О таких я что-то не слышал. Можно название конкретных реализаций?

0
28.07.2020, 16:22

Не по теме:

Цитата Сообщение от asbvic Посмотреть сообщение
но ведь пока это все гипотезы, доказательство которых на практике безумно сложно.
это научные факты
Цитата Сообщение от asbvic Посмотреть сообщение
О таких я что-то не слышал. Можно название конкретных реализаций?
хотя бы пресловутый QRBG121

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.07.2020, 16:22

Функция Rand с вещественными числами
День добрый, есть вот такая программа, которая вычисляет разность между суммой поддиагональных и наддиагональных элементов матрицы, размер...

Как устроена функция rand()
Объясните пожалуйста как работает функция rand(). Допустим нужно найти кол-во элементов равное 0 в динамическом массиве который состоит из...

Функция rand() в диапазоне [-131072:131071]
Нужно получить значения в rand() в диапазоне . srand(time(NULL)); for (int i = 0; i&lt;100; i++) baroat = rand() % 131072 - 131071; ...

Функция rand не генерирует случайные числа
Почему у меня не работае функция rand? srand(1); for(i=0; i4;i++) { qi=rand(); qi%=10; ...

Функция rand() выдает одно и то же число
#include &lt;stdlib.h&gt; #include &lt;stdio.h&gt; void main() { int i=rand()%10; printf(&quot;%d&quot;,i); } при запуске,на одном компьютере все...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru