Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
 Аватар для Джон Кофи
266 / 81 / 18
Регистрация: 05.04.2018
Сообщений: 1,102
Записей в блоге: 1

Особенности rand()

29.08.2018, 09:21. Показов 1839. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет. Написал в морском бое авто расстановку кораблей (пока только 4х палубных, но я в процессе!). функция случайного поворота кораблей такая
C++
1
rotation = rand() % 2;
те если rotation == 1, то размещаем по горизонтали, если 0, то по вертикали.
Только вот работает она не случайно. Не было еще так, чтобы корабль размещенный по вертикали, к примеру, сразу после этого был размещен по горизонтали. Я запускал функцию около 50 раз и в среднем сначала 5-6 раз корабль разместится по горизонтали или вертикали и только потом по вертикали или горизонтали соответственно. Почему так? как сделать настоящий рандом?!
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.08.2018, 09:21
Ответы с готовыми решениями:

Особенности использования функции rand() в С++
Не пойму почему Visual Studio ругается когда я создал класс и описывая его хочу использовать функцию rand() подключая при этом и stdlib.h и...

rand
Что бы rand выводил четный и нечетные цифры i = rand ?? полный код не обязателен

Rand()
Ребята срочно nомогите , как сгенерировать с nомощью функции rand() рандомные числа 0 или 1 ?

16
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
29.08.2018, 09:37
Джон Кофи, srand использовали?
0
2734 / 888 / 331
Регистрация: 10.02.2018
Сообщений: 2,108
29.08.2018, 10:14
Может это только "кажется".
Попробовал генерировать последовательность. Действительно, в глаза бросаются большие участки повторения 1 и 0.
Но если попытаться проанализировать последовательности из повторений (XX) и смен (XY), то всё более-менее ровно.
Кликните здесь для просмотра всего текста
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
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <time.h>
 
#define SEQUENCE_LEN 5
 
int main()
{
    srand(time(0));
 
    int xx = 0;
    int xy = 0;
    int cntXX = 0;
    int cntXY = 0;
    char temp[10000];
    for (int i=0; i<sizeof(temp); i++)
    {
        temp[i] = rand() % 2;
 
        if (i>0)
        {
            if (temp[i] == temp[i-1])
            {
                xx++;
                xy=0;
                if (xx >= SEQUENCE_LEN)
                    cntXX++;
            }
            else
            {
                xx=0;
                xy++;
                if (xy >= SEQUENCE_LEN)
                    cntXY++;
            }
        }
    }
 
    printf("XX=%d\nXY=%d\n", cntXX, cntXY);
    return 0;
}
0
 Аватар для Джон Кофи
266 / 81 / 18
Регистрация: 05.04.2018
Сообщений: 1,102
Записей в блоге: 1
29.08.2018, 10:18  [ТС]
Байт,
Цитата Сообщение от Байт Посмотреть сообщение
srand использовали?
а то!
Ygg,
Цитата Сообщение от Ygg Посмотреть сообщение
Может это только "кажется".
может быть, сам иногда так думаю, но все равно ощущение, что рандом не рандом
0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
29.08.2018, 10:20
Джон Кофи, может быть вы неправильно использовали srand? Его нужно запускать только один раз за все исполнение программы (обычно в начале), а не в методах, как иногда это ошибочно делают.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
29.08.2018, 10:26
Лучший ответ Сообщение было отмечено Джон Кофи как решение

Решение

Цитата Сообщение от Джон Кофи Посмотреть сообщение
Почему так? как сделать настоящий рандом?!
Потому что rand генерирует псевдослучайные числа. Линейный конгруэнтный метод->модуль являющийся степенью двойки "патамушта быстра"->хреновое поведение младших битов.
1) rotation = rand() % 32<16?0:1.
2) Переходить на аппаратный генератор случайных чисел (не факт что он вообще есть).
1
 Аватар для Джон Кофи
266 / 81 / 18
Регистрация: 05.04.2018
Сообщений: 1,102
Записей в блоге: 1
29.08.2018, 10:29  [ТС]
QuakerRUS,
Цитата Сообщение от QuakerRUS Посмотреть сообщение
может быть вы неправильно использовали srand?
C++
1
srand(time(NULL));
прописан однажды в начале функции вне циклов.
* * *
я очень долго разбирал вашу функцию авто расстановки, но потом все-таки решил делать по-своему. В вашей функции 4х и 3х палубные могут изгибаться? Вплотную друг к другу не становятся? я так и не понял, а понять вашу функцию хочется.
Кликните здесь для просмотра всего текста
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
void  setup()
{
    int rotation, bad, nx, ny, fail = 1, count;
    
    srand(time(0));
 
    //Ðàçìåùåíèå êîðàáëåé
    while (fail == 1)
    {
        fail = 0;
 
        for (int i = 0; i < N; i++)
        {
            for (int j = 0; j < N; j++)
                comp_map[i][j] = 0;
        }
 
        for (int ship = 4; ship >= 1; ship--)
        {
            for (int n = 0; n <= 4 - ship; n++)
            {
                rotation = rand() % 2;
                x = rand() % N;
                y = rand() % N;
                count = 0;
 
                do
                {
                    bad = 0;
 
                    x++;
                    count++;
 
                    if (x == N)
                    {
                        y++;
                        x = 0;
 
                        if (y == N)
                            y = 0;
                    }
 
                    if (count >= N * N)
                        fail = 1;   // òóïèêîâûé ðàñêëàä, íàäî çàíîâî ðàññòàâëÿòü êîðàáëè
 
                    for (int i = 0; i < ship && bad == 0; i++)
                    {
                        if (rotation == 0)
                        {
                            nx = x + i;
                            ny = y;
                        }
                        else
                        {
                            nx = x;
                            ny = y + i;
                        }
 
                        bad = check(nx, ny);    // ïðîâåðêà âîçìîæíîñòè ïîñòàâèòü êîðàáëü â ýòîì ìåñòå
 
                    }
                } while (bad == 1 && fail == 0);
 
                for (int i = 0; i < ship; i++)
                {
                    if (rotation == 0)
                    {
                        nx = x + i;
                        ny = y;
                    }
                    else
                    {
                        nx = x;
                        ny = y + i;
                    }
 
                    comp_map[nx][ny] = 98;
                }
            }
        }
    }
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int check(int x, int y)
{
    int rezult = 0, nx, ny;
 
    if (x < 0 || x >= N || y < 0 || y >= N)
        rezult = 1;
 
    for (int i = -1; i <= 1 && rezult == 0; i++)
    {
        for (int j = -1; j <= 1 && rezult == 0; j++)
        {
            nx = x + i;
            ny = y + j;
 
            if (nx >= 0 && nx <= N && ny >= 0 && ny < N && comp_map[nx][ny] != 0)
                rezult = 1;
        }
    }
 
    return rezult;
}

У меня функция без циклов, вся из if и else... получилось достаточно громоздко, но зато работает отлично, кроме повторений конечно, о которых я тут пишу.
0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
29.08.2018, 10:32
Цитата Сообщение от Джон Кофи Посмотреть сообщение
прописан однажды в начале функции вне циклов.
А должен быть в начале в main, если функция может быть вызвана повторно.

Добавлено через 2 минуты
Цитата Сообщение от Джон Кофи Посмотреть сообщение
В вашей функции 4х и 3х палубные могут изгибаться?
Не могут. Где вы видели Г-образные корабли? В классическом варианте 1 четырехпалубник, 2 трехпалубника, 3 двухпалубника и 4 однопалубника, которые не могут "изгибаться".

Цитата Сообщение от Джон Кофи Посмотреть сообщение
Вплотную друг к другу не становятся?
Не становятся.
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
29.08.2018, 11:42
До кучи
https://www.cyberforum.ru/c-be... 33144.html
тут обсуждаются некоторые аспекты поведения rand()
И конечно, стоит прислушаться к замечанию уважаемого Renji, в посте 6
1
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
29.08.2018, 11:58
Байт, у себя на VS2017 "похожести" чисел не наблюдаю. Может это зависит от компилятора?
0
 Аватар для Джон Кофи
266 / 81 / 18
Регистрация: 05.04.2018
Сообщений: 1,102
Записей в блоге: 1
29.08.2018, 11:59  [ТС]
Цитата Сообщение от Байт Посмотреть сообщение
https://www.cyberforum.ru/c-beginners/rathread2233144.html
страница не найдена

Добавлено через 57 секунд
Цитата Сообщение от QuakerRUS Посмотреть сообщение
на VS2017 "похожести" чисел не наблюдаю.
проверю дома на VS2015 - отпишусь, на работе только Dev
0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
29.08.2018, 12:46
Цитата Сообщение от Джон Кофи Посмотреть сообщение
страница не найдена
"ra" удалите.

Добавлено через 32 минуты
Не вижу что то никаких зависимостей.

vc++
http://rextester.com/EXN93275

gcc
http://rextester.com/JPM44456

clang
http://rextester.com/DSM46148

Добавлено через 14 минут
Для vc++ зависимость все же вижу определенную. Первый вызов случайного числа после установки последовательности похож на соседние последовательности, последующие вызовы уже не так похожи.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
29.08.2018, 13:10
Цитата Сообщение от QuakerRUS Посмотреть сообщение
Не вижу что то никаких зависимостей.
Корреляцию пинговать надо. Для gcc если предыдущее число было нечетным, вероятность выпадения четного числа повышается. Не то чтобы сильно повышается, но разница есть. Тогда как Студия дает статистику покрасивей. То есть, зависит от компилятора - где-то настройки генератора случайных чисел подбирали лучше, где то хуже.
2
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
29.08.2018, 13:17
Цитата Сообщение от Renji Посмотреть сообщение
Для gcc если предыдущее число было нечетным, вероятность выпадения четного числа повышается
По-моему это все же из разряда "повезло".
http://rextester.com/PCHS6207
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
29.08.2018, 13:29
Цитата Сообщение от QuakerRUS Посмотреть сообщение
По-моему это все же из разряда "повезло".
Перебираем разные семена генератора - статистику стабильно перекашивает на те же процентов десять. Хотя да, с разными семенами - в разную сторону.
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
29.08.2018, 16:12
Цитата Сообщение от Джон Кофи Посмотреть сообщение
страница не найдена
как работает рандом?
А так?
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12937 / 6804 / 1821
Регистрация: 18.10.2014
Сообщений: 17,221
29.08.2018, 19:27
Цитата Сообщение от Джон Кофи Посмотреть сообщение
Не было еще так, чтобы корабль размещенный по вертикали, к примеру, сразу после этого был размещен по горизонтали.
Вы рассказываете словесные сказки, но не показываете кода. Скорее всего, накосячили именно вы, но нам отсюда не видно.

Добавлено через 3 минуты
Цитата Сообщение от Renji Посмотреть сообщение
Линейный конгруэнтный метод->модуль являющийся степенью двойки "патамушта быстра"->хреновое поведение младших битов.
Это популярная байка про криво реализованный BSD-шный rand (LCG(231, 1103515245, 12345, 12345) по классификации отсюда), который существовал 100500 лет назад . Не имеет никакого отношения к LCG-генераторам в общем. Никакого "хренового поведение младших битов" у них нет.
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.08.2018, 19:27
Помогаю со студенческими работами здесь

rand
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;cstdlib&gt; // гениратор случайных чисел using namespace std; ...

rand()%(-20)%(20);
Нужно сорт случ числа от -20 до 20 Делаю так rand()%(-20)%(20); получаю числа от 0 до 20, а мне нужно от -20 ;

rand()
начал учить си++, наткнулся на такую штуку... Накидал простую программку (консольную) и увидел что датчик случ. чисел выдает нифига...

Rand()
metka: r1=rand()%2; r2=rand()%2; if(r1==a &amp;&amp; r2==b)goto metka; else arr=='O'; Собсно-это кусок кода...

rand от 1 до 16
Вопрос в том как в функции rand() на c++ задать диапазон чисел от 1 до 16


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru