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

рандомное число всегда 22.... почему ? - C++

Восстановить пароль Регистрация
 
Evgeni pengwin
 Аватар для Evgeni pengwin
0 / 0 / 0
Регистрация: 27.12.2012
Сообщений: 20
10.02.2013, 12:40     рандомное число всегда 22.... почему ? #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
53
54
#include <iostream>
#include <ctime>
using namespace std;
int main ()
{
    // нужны две константы (Ширины и высоты поля)
    
    
    const int Width (20), Height (10); //ширина и высота
    const char Live ('#'), Dead ('*'); // мертвые и живые клетки
    
    // нужна переменная которая будет указывать кол-во поколений
    
    
    int Generation (5);
    
    // Массивы (у клеток может быть два состояния живое или мертвое, поэтому проще создать тип Bool (trye- живая клетка, False - мертвая))
 
 
    bool Mass [Width * Height] = {false};
 
    srand ((unsigned) time (NULL));
 
    //_______________________________________________________________________________
    
    // показ содержимого массива
 
    //___________________________________________________________________________________
 
    for (int y = 0 ; y < Height; y++)
    {
        for (int x = 0; x < Width; x++)
        {
            if (Mass [x + y * Width])
            {
                cout << Live;
            }
            else
            {
            cout << Dead;
            }
        }
        cout << endl;
    }
    // Рандом для массива
    
    
    short Random = rand ();
    cout << Random << endl;
 
    
 
return 0;
}
рандомное число всегда 22.... почему ?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Van111
кодер с++
208 / 187 / 4
Регистрация: 03.08.2011
Сообщений: 2,585
Записей в блоге: 12
10.02.2013, 12:53     рандомное число всегда 22.... почему ? #2
Evgeni pengwin, вот как выводится у меня
stdout:
********************
********************
********************
********************
********************
********************
********************
********************
********************
********************
-2287
stdout:
********************
********************
********************
********************
********************
********************
********************
********************
********************
********************
-1450
stdout:
********************
********************
********************
********************
********************
********************
********************
********************
********************
********************
31181
http://liveworkspace.org/code/1vFQ23$1
потрудитесь выложить весь код
Evgeni pengwin
 Аватар для Evgeni pengwin
0 / 0 / 0
Регистрация: 27.12.2012
Сообщений: 20
10.02.2013, 13:13  [ТС]     рандомное число всегда 22.... почему ? #3
все проблема не актуальна (само собой как то решилось))
-=ЮрА=-
Заблокирован
Автор FAQ
10.02.2013, 13:16     рандомное число всегда 22.... почему ? #4
Evgeni pengwin,
Цитата Сообщение от Evgeni pengwin Посмотреть сообщение
// показ содержимого массива
Цитата Сообщение от Evgeni pengwin Посмотреть сообщение
bool Mass [Width * Height] = {false};
- он же ведь инициализирован у тебя одними false
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
#include <iostream>
#include <ctime>
using namespace std;
int main ()
{
    // нужны две константы (Ширины и высоты поля)
    const int Width  = 20;
    const int Height = 10; 
    char Live  = '#';
    char Dead  = '*'; // мертвые и живые клетки
    
    // нужна переменная которая будет указывать кол-во поколений
    int Generation = 5;
    // Массивы (у клеток может быть два состояния живое или мертвое, 
    //поэтому проще создать тип Bool (trye- живая клетка, False - мертвая))
    bool Mass [Width * Height] = {false};
    srand (time (0));
    //_______________________________________________________________________________
    
    // показ содержимого массива (Ну а где ты его инициалиизровал.хотя бы так 
    //Mass [x + y * Width] = rand() % 2;???Ну как можно допускать такие детские ошибки?(!)
 
    //___________________________________________________________________________________
 
    for (int y = 0 ; y < Height; y++)
    {
        for (int x = 0; x < Width; x++)
        {
            Mass [x + y * Width] = rand() % 2;
            if (Mass [x + y * Width])
                cout << Live;
            else
                cout << Dead;
        }
        cout << endl;
    }
    // Рандом для массива
    
    
    short Random = rand ();
    cout << Random << endl;
    return 0;
}
Цитата Сообщение от Evgeni pengwin Посмотреть сообщение
short Random = rand ();
Цитата Сообщение от Evgeni pengwin Посмотреть сообщение
рандомное число всегда 22.... почему ?
- потмоу что у ранда возвращаемый тип int а не short
Миниатюры
рандомное число всегда 22.... почему ?  
paserge
-3 / 0 / 0
Регистрация: 16.01.2013
Сообщений: 42
12.02.2013, 02:16     рандомное число всегда 22.... почему ? #5
Рандом это псевдослучайное число которое выбирается из длинного ряда постоянных чисел поэтому чтобы получить реально случайное число надо умножить его на что то типа даты.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
12.02.2013, 02:26     рандомное число всегда 22.... почему ? #6
Цитата Сообщение от paserge Посмотреть сообщение
Рандом это псевдослучайное число которое выбирается из длинного ряда постоянных чисел поэтому чтобы получить реально случайное число надо умножить его на что то типа даты.
не совсем так уж и просто
для сишного ГПСЧ (генератора псевдослучайных чисел) в большинстве стандартных библиотек используется ЛКМ (линейный конгруэнтный метод). Вообщемто он выглядит так:

http://www.cyberforum.ru/cgi-bin/latex.cgi?X_{k+1} = (a X_k + c)~~\bmod~~m

a, c, m для стандартной библиотеки фиксированы, а от X0 зависит вся последовательность. Если X0 давать на вход генератора один и тот же, то и последовательности псевдослучайных чисел окажутся одинаковые. (Этот x0 отдаленно и есть то, что дается на вход srand)

Чтобы последовательности были каждый раз разные туда суют текующую дату в представлении time_t
NeonLost
Пес войны
 Аватар для NeonLost
74 / 85 / 3
Регистрация: 23.02.2012
Сообщений: 653
12.02.2013, 08:09     рандомное число всегда 22.... почему ? #7
лучше использовать с++ рандом, и инициаллизировать его девайсид, а не временем, чем Сишный сранд...)
booker
 Аватар для booker
23 / 23 / 2
Регистрация: 21.11.2012
Сообщений: 106
12.02.2013, 09:55     рандомное число всегда 22.... почему ? #8
лучше использовать с++ рандом, и инициаллизировать его девайсид, а не временем, чем Сишный сранд...)
Вот еще бы примерчик для наглядности, мы бы вам даже спасибо сказали)
NeonLost
Пес войны
 Аватар для NeonLost
74 / 85 / 3
Регистрация: 23.02.2012
Сообщений: 653
12.02.2013, 18:42     рандомное число всегда 22.... почему ? #9
C++
1
2
3
4
5
6
typedef boost::mt19937 RNGType;
    boost::random::random_device rd;
    RNGType rng(rd());
    boost::uniform_int<> one_to_six( 1, 600 );
    boost::variate_generator< RNGType, boost::uniform_int<> >dice(rng, one_to_six);
    return dice();
Добавлено через 59 минут
ой, тоже самое тока std
booker
 Аватар для booker
23 / 23 / 2
Регистрация: 21.11.2012
Сообщений: 106
12.02.2013, 20:19     рандомное число всегда 22.... почему ? #10
генерируемые таким образом числа более псевдослучайны?
NeonLost
Пес войны
 Аватар для NeonLost
74 / 85 / 3
Регистрация: 23.02.2012
Сообщений: 653
12.02.2013, 21:08     рандомное число всегда 22.... почему ? #11
Цитата Сообщение от booker Посмотреть сообщение
генерируемые таким образом числа более псевдослучайны?
они потокобезопасны...и в один момент времени дадут разные числа...)
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
12.02.2013, 21:46     рандомное число всегда 22.... почему ? #12
Цитата Сообщение от NeonLost Посмотреть сообщение
они потокобезопасны...и в один момент времени дадут разные числа...)
йеп, действительно
The function rand() is not reentrant or thread-safe, since it uses hidden state that is modified on each call. This might just be the seed value to be used by the next call, or it might be something more elaborate. In order to get reproducible behaviour in a threaded application, this state must be made explicit. The function rand_r() is supplied with a pointer to an unsigned int, to be used as state. This is a very small amount of state, so this function will be a weak pseudo-random generator. Try drand48_r(3) instead.
NeonLost
Пес войны
 Аватар для NeonLost
74 / 85 / 3
Регистрация: 23.02.2012
Сообщений: 653
12.02.2013, 22:05     рандомное число всегда 22.... почему ? #13
Цитата Сообщение от alex_x_x Посмотреть сообщение
йеп, действительно
если покажешь мне пример с моей функцией, где все потоки вернут одно число, то соглашусь...)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.02.2013, 22:23     рандомное число всегда 22.... почему ?
Еще ссылки по теме:

C++ Рандомное число в заданном интервале
Почему всегда выполняется условие? C++
C++ Рандомное число

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

Или воспользуйтесь поиском по форуму:
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
12.02.2013, 22:23     рандомное число всегда 22.... почему ? #14
Цитата Сообщение от NeonLost Посмотреть сообщение
если покажешь мне пример с моей функцией, где все потоки вернут одно число, то соглашусь...)
причем твоя фунция? я написал, что rand действительно не потоко-безопасный
Yandex
Объявления
12.02.2013, 22:23     рандомное число всегда 22.... почему ?
Ответ Создать тему
Опции темы

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