Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
45 / 21 / 6
Регистрация: 28.02.2013
Сообщений: 194

Неравномерность распределения полученного с помощью rand()

02.01.2017, 18:56. Показов 1938. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Обнаружил странный баг в функции rand().
картинка 640х480 заполняется случайно ч/б пикселями построчно.
вот код и картинка:

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
#include <iostream>
#include "opencv2/opencv.hpp"
 
 
 
using namespace std;
using namespace cv;
 
int main(){
 
    Mat img = Mat(480, 640, CV_8UC1);
 
    for (int seed = 0; seed < 2000; seed += 10){
 
        srand(seed);
 
        for (int row = 0; row < img.rows; row++){
            for (int col = 0; col < img.cols; col++){
                img.at<uchar>(row, col) = 255 * (rand() % 2);
            }
        }
        cout << "seed: " << seed << endl;
        imshow("test", img);
        waitKey(1000);
 
    }
 
 
    cout << endl << endl;
    system("pause");
    return 0;
}
При разных значениях seed картинка меняется но не принципиально! полосы остаются!
и если например ширина картинки будет 645 то получается на глаз очень равномерный шум.
Миниатюры
Неравномерность распределения полученного с помощью rand()  
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.01.2017, 18:56
Ответы с готовыми решениями:

Как задать диапазон с помощью функции rand?
В задаче говорится &quot;Дан массив целых чисел (размер – случайное число из диапазона )&quot;. Как задать диапазон с помощью функции...

С помощью rand() сделать генератор дробных чисел
srand(time(NULL)); rand()%1000; этот генератор генерирует целые числа, как сделать что-бы он генерировал нецелые числа до 3-х знаков...

Заполнить двумерный массив с помощью rand() и вывести его
Всем привет, в общем обучение идет полным ходом и столкнулся с непонятным явлением. Пытаясь заполнить двумерный массив с помощью rand() и...

11
109 / 108 / 74
Регистрация: 18.11.2013
Сообщений: 304
02.01.2017, 19:02
srand вынесети из цикла for

Добавлено через 1 минуту
зачем вы каждый раз инициализируете генератор?
0
45 / 21 / 6
Регистрация: 28.02.2013
Сообщений: 194
02.01.2017, 19:10  [ТС]
Цитата Сообщение от cybeuser Посмотреть сообщение
srand вынесети из цикла for
к чему это? полосы есть при любом srand и при его отсутствии.

Добавлено через 6 минут
Думаю это просто баг алгоритма.
0
109 / 108 / 74
Регистрация: 18.11.2013
Сообщений: 304
02.01.2017, 19:11
nefton, это могло бы послужить равномерности

Добавлено через 19 секунд
в чем баг?
0
3178 / 1937 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
02.01.2017, 19:16
Это не баг, это фича ©

Linear congruential generator

Вместо встроенного PRNG используйте что-либо получше, например Mersenne Twister
0
45 / 21 / 6
Регистрация: 28.02.2013
Сообщений: 194
02.01.2017, 19:17  [ТС]
версия студии
Миниатюры
Неравномерность распределения полученного с помощью rand()  
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
02.01.2017, 19:40
Цитата Сообщение от nefton Посмотреть сообщение
C++
1
img.at<uchar>(row, col) = 255 * (rand() % 2);
C++
1
img.at<uchar>(row, col) = 255 * (rand() / (RAND_MAX / 2 + 1));
Это баг, но твоего алгоритма. Потерял равномерное распределение - вот и получил такой результат.
0
109 / 108 / 74
Регистрация: 18.11.2013
Сообщений: 304
02.01.2017, 19:57
DrOffset, но ведь и так и так будет равномерное распределение, разве нет?

Добавлено через 10 минут
nefton, можно ли называть багом равномерность, используя генератор с равномерным распределением?
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
02.01.2017, 20:16
Лучший ответ Сообщение было отмечено nefton как решение

Решение

Цитата Сообщение от cybeuser Посмотреть сообщение
но ведь и так и так будет равномерное распределение, разве нет?
Конечно нет.
Грубо обрезая диапазон [0, RAND_MAX] по модулю 2, мы его (равномерное распределение) теряем.
Вот неплохое объяснение: http://stackoverflow.com/a/10984975

Добавлено через 14 минут
Вообще, некорректность использования формулы rand() % N уже давно всем известна, странно называть это багом, когда такие вещи уже давно вынесены в FAQ; Например: http://c-faq.com/lib/randrange.html
3
109 / 108 / 74
Регистрация: 18.11.2013
Сообщений: 304
02.01.2017, 20:22
DrOffset, спасибо, но вероятность не сильно лучше при использовании приведенной вами формулой
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
#include <iostream>
#include <cstdlib>
 
using std::cout;
using std::cin;
using std::endl;
 
int main()
{
    int num = 0;
    unsigned long one = 0, zero = 0, N = 100;
    
    cout << "N = ";
    cin >> N;
    
    srand(0);
    
    for(unsigned long i = 0; i < N; i++)
    {
        num = rand()%2;
        if(num)
            one++;
        else
            zero++;
    }
        
    cout << "rand()%2 : P(1) = " << 1.0*one/N << ", P(0) = " << 1.0*zero/N << endl;
    
    srand(0);
    
    one = 0;
    zero = 0;
    
    for(unsigned long i = 0; i < N; i++)
    {
        num = (rand() / (RAND_MAX / 2 + 1));
        if(num)
            one++;
        else
            zero++;
    }
    
    cout << "(rand() / (RAND_MAX / 2 + 1)): P(1) = " << 1.0*one/N << ", P(0) = " << 1.0*zero/N << endl;
    
    return 0;
}
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
02.01.2017, 20:31
Цитата Сообщение от cybeuser Посмотреть сообщение
вероятность не сильно лучше при использовании приведенной вами формулой
Никто и не обещал этого.
Задача была убрать полосы.

Для более качественного результата нужно менять гпсч.
1
109 / 108 / 74
Регистрация: 18.11.2013
Сообщений: 304
02.01.2017, 20:31
DrOffset, я вас понял, спасибо за ответы.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.01.2017, 20:31
Помогаю со студенческими работами здесь

Нужно сгенерировать элементы массива случайным образом с помощью функции rand
Нужно сгенерировать элементы случайным образом с помощью функции rand. Определить индексы максимального элемента матрицы. Вычислить...

Можно ли получить значение элемента кортежа полученного с помощью make_tuple
Здравствуйте, есть массив it = make_tuple(i, j, false); Есть ли возможность получить третье значение (false) , зная лишь i и j

Найти ряд распределения полученного числа
на карточках написаны цифры: 1, 2, и 3. наугад три раза (с возвратом) берется одна из карточек и находится сумма чисел, изображенных на...

Для распределения по нормальному закону подойдет функция rand?
Дано задание по php: Для выборки из 100 случайных величин, распределенных по нормальному закону, создать полигон и гистограмму частот....

Построить график плотности распределения полученного посредством GPSS
Не могу справиться с поставленной задачей, в gpss не работал и азов не знаю, что-то рассказывали так поверхностно, что то вроде &quot; вот...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru