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

Рандом - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 32, средняя оценка - 4.78
TXLib.h
 Аватар для TXLib.h
3 / 3 / 0
Регистрация: 01.12.2010
Сообщений: 68
10.02.2011, 19:04     Рандом #1
возникла проблема - я создал массив, состоящий из десяти рандомных чисел. Только вот рандомными они становиться не хотят. Правда, на одном компе он выдаёт одну последовательность, на другом - другую, но при повторной (второй, десятой, тысячной) компиляции на одном и том же компе выдаётся одинаковый набор чисел - подскажите, в чём проблема?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.02.2011, 19:04     Рандом
Посмотрите здесь:

Рандом C++
рандом C++
рандом C++
C++ Структура и рандом.
C++ Другой рандом
Массив и рандом C++
C++ Про рандом
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
10.02.2011, 19:08     Рандом #2
srand(time(0))

Добавлено через 43 секунды
Srand
rand() & srand()
TXLib.h
 Аватар для TXLib.h
3 / 3 / 0
Регистрация: 01.12.2010
Сообщений: 68
10.02.2011, 19:20  [ТС]     Рандом #3
спс. кстати, как сделать так, чтобы все числа в массиве различались и были рандомными?
сейчас же у нас работают строки
C++
1
2
srand(time(0));
        x [i] = rand () % 100 * 100 + i;
Добавлено через 4 минуты
и ещё:
почему на конце рандомного числа не пишется номер ячейки, хотя прописано + i?

Вот весь код, на всякий случай:
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
#include "TXLib.h"
 
int main()
{
    txCreateWindow (500, 500);
    const int SIZE = 10;
    int x [SIZE] = {};
    int i = 0;
 
    while (i < SIZE)
    {
        assert (0 <= i && i < SIZE);
        srand(time(0));
        x [i] = rand () % 100 * 100 + i;
        i++;
    }
    i = 0;
   int max = x [i];
   int iMax = i;
   i = 1;
    
    while (i < SIZE)
    {
        if (x [i] > max)
        {
            x [i] = max;
            i++;
            iMax = i;
        }
        
        if (x [i] <= max)
        {
            i++;
        }
    }
    i = 0;
    while (i < SIZE - 1)
    {
        printf ("x [%d] = %d \n", i, x [i]);
        i++;
    }
    
    while (i < SIZE)
    {
        printf ("MAX: x [%d] =  %d", iMax - 1, max);
        i++;
    }
    return 0;
}
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
10.02.2011, 19:35     Рандом #4
Цитата Сообщение от TXLib.h Посмотреть сообщение
спс. кстати, как сделать так, чтобы все числа в массиве различались и были рандомными?
ну общего подхода нет
можно генерировать случайное число, и проверять не встречалось ли оно до этого
можно нечто другое придумать
Цитата Сообщение от TXLib.h Посмотреть сообщение
assert (0 <= i && i < SIZE);
ассерт хорошо, но это уж както слишком параноидально
Цитата Сообщение от TXLib.h Посмотреть сообщение
if (x [i] > max)
{
x [i] = max;
i++;
iMax = i;
}
if (x [i] <= max)
{
i++;
}
не вижу сильно смысла смещать iMax, проще при выводе +1 сделать
и вообще ++i можно в отдельную инструкцию цикла вынести

Цитата Сообщение от TXLib.h Посмотреть сообщение
while (i < SIZE)
{
printf ("MAX: x [%d] = %d", iMax - 1, max);
i++;
}
зачем это вообще в цикле?
TXLib.h
 Аватар для TXLib.h
3 / 3 / 0
Регистрация: 01.12.2010
Сообщений: 68
10.02.2011, 19:49  [ТС]     Рандом #5
в конце концов надо показать, какое число является максимальным.

Добавлено через 1 минуту
пардон, просто вопрос не понял.

Добавлено через 1 минуту
и всё же я не понимаю, почему на конце чисел не пишется номер ячейки

Добавлено через 1 минуту
всё-всё понял.
в 17 строке я обнулил i.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
10.02.2011, 20:25     Рандом #6
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
const size_t SIZE = 10;
 
int main()
{
    int x [SIZE] = {};
    srand(time(0));
    bool bIsNotExist;
    for( size_t i=0;i<SIZE;++i )
    {   
        bIsNotExist = true;
        do{        
          x [i] = rand () % 100;
          for( size_t j=0;j<i;++j ){
            if( x[i] == x[j] ){
              bIsNotExist = false;
              break;
            }
          }
        }while( false == bIsNotExist );
    }
 
    int max = x[0];
    int iMax = 0;
        
    for( size_t i=1;i<SIZE;++i )
    {
        if (x [i] > max)
        {
            x [i] = max;
            iMax = i;
        }
    }
    for(size_t i=0;i<SIZE;++i)
    {
        printf ("x[%d] = %d\n", i, x [i]);
    }
   
    printf ("\nMAX: x [%d] =  %d", iMax - 1, max);
    return 0;
}
не принимайте близко к сердцу

вижу сами разрешили, srand(time(0)) инициализирует генератор случайных чисел, его следует вызывать только один раз

и ящитаю, что нужно чаще for использовать (в пределе его можно везде использовать), особенно там где его применение очевидно (в случаях, когда колво итераций заранее известно)

Добавлено через 26 минут
вот правильный вариант

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 <cstdlib>
#include <cstdio>
#include <ctime>
 
const size_t SIZE = 10;
 
int main()
{
    int x [SIZE] = {};
    srand(time(0));
    bool bIsExist;
    for( size_t i=0;i<SIZE;++i )
    {   
        do{
          bIsExist = false;        
          x[i] = rand () % 15;
          printf( "(%d) ", x[i] );
          for( size_t j=0;j<i;++j ){
            if( x[i] == x[j] ){
              bIsExist = true;
              break;
            }
          }
        }while( bIsExist );
        printf( "x[%u]=%d ", i, x[i] );
    }
 
    int max = x[0];
    int iMax = 0;
        
    for( size_t i=1;i<SIZE;++i )
    {
        if (x [i] > max)
        {
            max = x[i];
            iMax = i;
        }
    }
    for(size_t i=0;i<SIZE;++i)
    {
        printf ("x[%u] = %d\n", i, x [i]);
    }
   
    printf ("\nMAX: x [%u] =  %d", iMax - 1, max);
    return 0;
}
BlackStranger
3 / 3 / 1
Регистрация: 14.12.2010
Сообщений: 36
10.02.2011, 23:14     Рандом #7
А можно еще подумать из какого распределения Вам нужны числа и сделать что-нибудь типа такого:
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
#include<windows.h>
 
// Моделирование случайной величины из равномерного распределения
double RandomUniform()  
{
    static const unsigned int A = 1686629717;
    static const unsigned int C = 907633385;
    static unsigned int n = GetTickCount();
 
    return ((double)(n = A*n+C))/0xFFFFFFFF;
}
 
// Моделирование случайной величины из нормального (alpha,sigma) распределения
double RandomNormal(double alpha, double sigma) 
{
    int n=0;
    double result=0;
    while(n<12)
    {
        result = result + RandomUniform();
        n++;
    }
    return (sigma*(result-6))+alpha;    
}
Если нужны целые числа, то можно округлить до целых, например, такой функцией:
C++
1
2
3
4
5
6
int RoundInt(double x)// Округление до целых 
{
    if(x>0) x=x+0.5;
    else x=x-0.5;
    return int(x);
}
Если нужны просто любые числа - поиграйтесь с параметрами нормального распределения.

//Материал из Википедии
Нормальное распределение зависит от двух параметров — смещения и масштаба.
Значения параметров соответствуют значениям среднего (математического ожидания) и разброса (стандартного отклонения).

Добавлено через 4 минуты
p.s. Данные функции будут всегда выдавать разные случайные величины.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
10.02.2011, 23:45     Рандом #8
BlackStranger, генерация равномерно распределенной велечины + центральная предельная теорема
чтоб пользоваться такими вещами нужны и знания соответствующие
BlackStranger
3 / 3 / 1
Регистрация: 14.12.2010
Сообщений: 36
11.02.2011, 00:01     Рандом #9
чтоб пользоваться такими вещами нужны и знания соответствующие
Согласен. Для диплома эти функции делал. Но в целом можно просто добавить их в проект и использовать. Другое дело, что если нужно лабу какую-нибудь сделать... То преподу может не очень понравиться такой подход!

Добавлено через 12 минут
Но здесь опять же можно чего-нибудь помутить с функцией GetTickCount(). Она возвращает количество миллисекунд, прошедших с момента старта системы.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.02.2011, 00:07     Рандом
Еще ссылки по теме:

Рандом rand C++
Рандом C++
не получается рандом C++
Рандом с шагом C++
C++ Рандом

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

Или воспользуйтесь поиском по форуму:
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
11.02.2011, 00:07     Рандом #10
ну вот поэтому с такими тонкостями настройки генератора я предпочел что-нибудь готовое, например из boost'а
Yandex
Объявления
11.02.2011, 00:07     Рандом
Ответ Создать тему
Опции темы

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