Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
san92der
14 / 14 / 7
Регистрация: 27.10.2012
Сообщений: 109
#1

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

27.10.2012, 15:40. Просмотров 1390. Ответов 8
Метки нет (Все метки)

Здравствуйте, форумчане!
Столкнулся с такой проблемой. Есть массив. Надо создать поток для заполнения массива случайными числами в случайном месте. Делаю это так:
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() не помогает
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.10.2012, 15:40
Я подобрал для вас темы с готовыми решениями и ответами на вопрос rand() в потоке (C++):

Rand() в потоке
Есть несколько потоков. В каждом потоке rand() дает одинаковые числа. Почему?

rand() в потоке
Запускается n потоковых функций, каждый из них приостанавливается во время...

Не могу создать поток( Нужно чтобы функция запускается в потоке и работала там пока не закроем в потоке)
хм.. не могу создать поток в c++ и направить туда. Нужно чтобы функция...

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

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

rand
всем привет) что означает вот это строка double value = (rand()%1000)/100.0 -...

8
Somebody
2799 / 1610 / 251
Регистрация: 03.12.2007
Сообщений: 4,211
Завершенные тесты: 3
27.10.2012, 16:34 #2
Возможно, сишная библиотека не инициализируется в потоках, создаваемым через std::thread. Попробуй random на C++:
C++
1
auto rand = bind(uniform_int_distribution<>(), default_random_engine());
0
kravam
быдлокодер
1706 / 893 / 105
Регистрация: 04.06.2008
Сообщений: 5,524
27.10.2012, 18:01 #3
когда-то занимался подобным; srand(time(0)) поможет, если вызовешь её в каждом потоке. Если не поможет, тогда вызывай её через разные промежутки времени. Достичь этого можно просто создавая потоки через разные промежутки времени
0
kd32n65
0 / 0 / 0
Регистрация: 27.10.2012
Сообщений: 8
27.10.2012, 18:17 #4
Вместо rand() пишите srand()
0
MrGrig
177 / 160 / 38
Регистрация: 08.10.2012
Сообщений: 422
27.10.2012, 19:19 #5
Цитата Сообщение от kravam Посмотреть сообщение
когда-то занимался подобным; srand(time(0)) поможет, если вызовешь её в каждом потоке. Если не поможет, тогда вызывай её через разные промежутки времени. Достичь этого можно просто создавая потоки через разные промежутки времени
Достаточно вызова 1 раза в мэйне
далее функция rand() будет использовать системные часы с дальнейшим их преобразованием в тип int
0
san92der
14 / 14 / 7
Регистрация: 27.10.2012
Сообщений: 109
27.10.2012, 22:57  [ТС] #6
srand() тут не поможет. тут каждый раз при создании потока при инициаоизации srand-ом нужен промежуток времени больше 1000 милисекунд(проверял), иначе будет генерировать одно и то же число. попробую сделать, чтобы поток не прерывался, а просто передавал контроль другому потоку. может так получится.
0
MrGrig
177 / 160 / 38
Регистрация: 08.10.2012
Сообщений: 422
27.10.2012, 23:01 #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
//вызов функции
}
0
san92der
14 / 14 / 7
Регистрация: 27.10.2012
Сообщений: 109
28.10.2012, 03:17  [ТС] #8
так заработает. но в примере, который я дал выше, потоки выполнялись по сто раз, и каждый раз rand был инициализирован одним и тем же числом. решил я так - теперь я в main-е убрал циклы, и поставил бесконечные циклы в каждом потоке. и теперь там не каждый раз происходит инициализация rand-a, а ряд продолжается.

Думаю, тему можно закрыть. Больше, чем я понял, всё равно в меня уже не влезет.
0
MrGrig
177 / 160 / 38
Регистрация: 08.10.2012
Сообщений: 422
28.10.2012, 09:43 #9
Цитата Сообщение от san92der Посмотреть сообщение
теперь там не каждый раз происходит инициализация rand-a, а ряд продолжается.
смысл его каждый раз инициализировать?
создать массив можно записать в него значений 1000 (тоже рандомных, не превышающих 100)
далее вызывать таким образом
C++
1
2
int a=rand()%mas[rand()%100]; //соответственно будет браться случайное значение и будет 
//браться остаток от деление на случайное число из вашего массива
Добавлено через 1 минуту
либо брать значения из массива по порядку
0
28.10.2012, 09:43
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.10.2012, 09:43
Привет! Вот еще темы с решениями:

rand()
Как записать чтобы rand() возвращало true и false. Или подскажите другой...

rand
srand(time(NULL)); int s = rand()%1000 +1; генерирует бред вроде...

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

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


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru