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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 32, средняя оценка - 4.78
TXLib.h
3 / 3 / 0
Регистрация: 01.12.2010
Сообщений: 68
#1

Рандом - C++

10.02.2011, 19:04. Просмотров 3992. Ответов 9
Метки нет (Все метки)

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

Другой рандом - C++
Есть некоторое беззнаковое целое N, нужна рандомная последовательность не повторяющихся беззнаковых целых меньше N. Длина...

Рандом растет - C++
srand(time(0)); int j=rand()%1000; char s="afasfa"; switch (message) /* handle the messages */ ...

Рандом в табилце - C++
Народ я только только начал учить C++ работаю в qt cretor вопрос такой: Есть таблица 10 на 10 как сделать так что бы в ней рандомно...

Структура и рандом. - C++
у меня в структуре есть пять типов данных struct Dzho { int pid; double burst; int priority; int working; int waiting; ...

Про рандом - C++
Как с++ одномерный массив из 10 элементов прорандомить так ,чтобы все элементы массива в сумме давали 1000 и были положительными (ноль...

Неправильный рандом - C++
Здравствуйте. Программа должна заполнять массив случайными, не повторяющимися элементами. Однако не смотря на то что максимальное значение...

Подтормаживающий рандом - C++
Сделал простую змейку. #include <iostream> #include <Windows.h> #include <cstdlib> #include <ctime> #include <conio.h> enum...

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

Добавлено через 43 секунды
Srand
rand() & srand()
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
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
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
3 / 3 / 0
Регистрация: 01.12.2010
Сообщений: 68
10.02.2011, 19:49  [ТС]     Рандом #5
в конце концов надо показать, какое число является максимальным.

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

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

Добавлено через 1 минуту
всё-всё понял.
в 17 строке я обнулил i.
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
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
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
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++
Всем доброго времени суток. Пытаюсь сделать программу, которая выдаёт рандомные числа, с помощью rand(), c определенным шагом. Изучаю язык...

Не повторяющий рандом - C++
Переменная rnd генерирует числа от 1 до 5 Как сделать, чтобы при выводе в консоли цифры не повторялись?

Рандом в границах - C++
нужен рандом, выдающий числа от 58 до 64. Именно через стандартрую рандом или рандомайз..

Массив и рандом - C++
2. Дан одномерный массив, состоящий из N целочисленных элементов. 2.1. Заполнить массив случайными числами. 2.2. Найти минимальный...


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

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

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