Форум программистов, компьютерный форум CyberForum.ru

rand() в потоке - C++

Восстановить пароль Регистрация
 
san92der
14 / 14 / 3
Регистрация: 27.10.2012
Сообщений: 108
27.10.2012, 15:40     rand() в потоке #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
#include "stdafx.h"
#include <iostream>
#include <thread>
#include <mutex>
#include <vector>
 
using namespace std;
 
struct cMass 
{
    mutex m;
    vector<int> mass;
 
    cMass():{
        for(int i=0; i<10; i++)
        mass.push_back(rand());
    }
 
    void push(int a){
        lock_guard<mutex> guard(m);
        mass.insert(mass.begin()+rand()%(mass.size()-1), rand());
            
    }
 
    void out(){
        lock_guard<mutex> guard(m);
        for(int i=0; i<mass.size(); i++)
              cout<<mass[i]<<' ';
        cout<<endl<<endl;
    }
 
 
};
 
int main()
{
    cMass cm;
     
    std::vector<std::thread> threads;
        for(int i = 0; i < 20; ++i) {
                   threads.push_back(std::thread([&cm](){counter.push();}));
                    threads.push_back(std::thread([&cm](){counter.out();}));
    }
     
    for(auto& thread : threads){
                thread.join();
    }
     
    int a; cin>>a;   
    return 0;
}
Но при заполнении массив заполняется каждый раз одним и тем же числом, хотя вставляет в разные места. Есть куча тем, где описывается, почему в разных потоках rand() вставляет одно и то же число, но по этой теме ничего не нашел. Или я вообще потоками не правильно пользуюсь? Помогите пожалуйста!

Добавлено через 51 минуту
srand() не помогает
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.10.2012, 15:40     rand() в потоке
Посмотрите здесь:

C++ rand()
rand C++
rand() C++
C++ Не могу создать поток( Нужно чтобы функция запускается в потоке и работала там пока не закроем в потоке)
rand() в потоке C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Somebody
2770 / 1583 / 141
Регистрация: 03.12.2007
Сообщений: 4,139
Завершенные тесты: 1
27.10.2012, 16:34     rand() в потоке #2
Возможно, сишная библиотека не инициализируется в потоках, создаваемым через std::thread. Попробуй random на C++:
C++
1
auto rand = bind(uniform_int_distribution<>(), default_random_engine());
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,265
27.10.2012, 18:01     rand() в потоке #3
когда-то занимался подобным; srand(time(0)) поможет, если вызовешь её в каждом потоке. Если не поможет, тогда вызывай её через разные промежутки времени. Достичь этого можно просто создавая потоки через разные промежутки времени
kd32n65
0 / 0 / 0
Регистрация: 27.10.2012
Сообщений: 8
27.10.2012, 18:17     rand() в потоке #4
Вместо rand() пишите srand()
MrGrig
176 / 159 / 2
Регистрация: 08.10.2012
Сообщений: 422
27.10.2012, 19:19     rand() в потоке #5
Цитата Сообщение от kravam Посмотреть сообщение
когда-то занимался подобным; srand(time(0)) поможет, если вызовешь её в каждом потоке. Если не поможет, тогда вызывай её через разные промежутки времени. Достичь этого можно просто создавая потоки через разные промежутки времени
Достаточно вызова 1 раза в мэйне
далее функция rand() будет использовать системные часы с дальнейшим их преобразованием в тип int
san92der
14 / 14 / 3
Регистрация: 27.10.2012
Сообщений: 108
27.10.2012, 22:57  [ТС]     rand() в потоке #6
srand() тут не поможет. тут каждый раз при создании потока при инициаоизации srand-ом нужен промежуток времени больше 1000 милисекунд(проверял), иначе будет генерировать одно и то же число. попробую сделать, чтобы поток не прерывался, а просто передавал контроль другому потоку. может так получится.
MrGrig
176 / 159 / 2
Регистрация: 08.10.2012
Сообщений: 422
27.10.2012, 23:01     rand() в потоке #7
Цитата Сообщение от san92der Посмотреть сообщение
srand() тут не поможет. тут каждый раз при создании потока при инициаоизации srand-ом нужен промежуток времени больше 1000 милисекунд(проверял), иначе будет генерировать одно и то же число. попробую сделать, чтобы поток не прерывался, а просто передавал контроль другому потоку. может так получится.
у меня почему то всегда работало
вы точно так делаете?
C++
1
2
3
4
5
6
7
8
9
10
void func(){
//bla bla bla
int buf=rand();
}
 
int main(){
srand(time(NULL));
//bla bla bla
//вызов функции
}
san92der
14 / 14 / 3
Регистрация: 27.10.2012
Сообщений: 108
28.10.2012, 03:17  [ТС]     rand() в потоке #8
так заработает. но в примере, который я дал выше, потоки выполнялись по сто раз, и каждый раз rand был инициализирован одним и тем же числом. решил я так - теперь я в main-е убрал циклы, и поставил бесконечные циклы в каждом потоке. и теперь там не каждый раз происходит инициализация rand-a, а ряд продолжается.

Думаю, тему можно закрыть. Больше, чем я понял, всё равно в меня уже не влезет.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.10.2012, 09:43     rand() в потоке
Еще ссылки по теме:

C++ rand от 1 до 16
rand C++
rand() C++

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

Или воспользуйтесь поиском по форуму:
MrGrig
176 / 159 / 2
Регистрация: 08.10.2012
Сообщений: 422
28.10.2012, 09:43     rand() в потоке #9
Цитата Сообщение от san92der Посмотреть сообщение
теперь там не каждый раз происходит инициализация rand-a, а ряд продолжается.
смысл его каждый раз инициализировать?
создать массив можно записать в него значений 1000 (тоже рандомных, не превышающих 100)
далее вызывать таким образом
C++
1
2
int a=rand()%mas[rand()%100]; //соответственно будет браться случайное значение и будет 
//браться остаток от деление на случайное число из вашего массива
Добавлено через 1 минуту
либо брать значения из массива по порядку
Yandex
Объявления
28.10.2012, 09:43     rand() в потоке
Ответ Создать тему
Опции темы

Текущее время: 05:50. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru