Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 32, средняя оценка - 4.78
TXLib.h
3 / 3 / 3
Регистрация: 01.12.2010
Сообщений: 68
#1

Рандом - C++

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

возникла проблема - я создал массив, состоящий из десяти рандомных чисел. Только вот рандомными они становиться не хотят. Правда, на одном компе он выдаёт одну последовательность, на другом - другую, но при повторной (второй, десятой, тысячной) компиляции на одном и том же компе выдаётся одинаковый набор чисел - подскажите, в чём проблема?
http://www.cyberforum.ru/cpp-beginners/thread2143210.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.02.2011, 19:04
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Рандом (C++):

Рандом
Нужна помощь!!!! Вот исходный код: #include "stdafx.h" #include <stdlib.h>...

рандом
подскажите что не так #include <iostream> #include <string> #include...

рандом
Нижно массив заполнить рандомом #include "stdafx.h" #include <iostream> ...

Рандом
Как проще всего рандомно разыграть для переменной значение 1 или 0....?

рандом
подскажите,плз,как рандомно выводить значения типа цццАцц, где ц-цифра, А-буква.

9
alex_x_x
бжни
2454 / 1660 / 134
Регистрация: 14.05.2009
Сообщений: 7,162
10.02.2011, 19:08 #2
http://www.cyberforum.ru/cpp-beginners/thread54354.html

Добавлено через 43 секунды
http://www.cyberforum.ru/cpp-beginners/thread203432.html
http://www.cyberforum.ru/cpp-beginners/thread55543.html
1
TXLib.h
3 / 3 / 3
Регистрация: 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;
}
0
alex_x_x
бжни
2454 / 1660 / 134
Регистрация: 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++;
}
зачем это вообще в цикле?
0
TXLib.h
3 / 3 / 3
Регистрация: 01.12.2010
Сообщений: 68
10.02.2011, 19:49  [ТС] #5
в конце концов надо показать, какое число является максимальным.

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

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

Добавлено через 1 минуту
всё-всё понял.
в 17 строке я обнулил i.
0
alex_x_x
бжни
2454 / 1660 / 134
Регистрация: 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;
}
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. Данные функции будут всегда выдавать разные случайные величины.
2
alex_x_x
бжни
2454 / 1660 / 134
Регистрация: 14.05.2009
Сообщений: 7,162
10.02.2011, 23:45 #8
BlackStranger, генерация равномерно распределенной велечины + центральная предельная теорема
чтоб пользоваться такими вещами нужны и знания соответствующие
0
BlackStranger
3 / 3 / 1
Регистрация: 14.12.2010
Сообщений: 36
11.02.2011, 00:01 #9
чтоб пользоваться такими вещами нужны и знания соответствующие
Согласен. Для диплома эти функции делал. Но в целом можно просто добавить их в проект и использовать. Другое дело, что если нужно лабу какую-нибудь сделать... То преподу может не очень понравиться такой подход!

Добавлено через 12 минут
Но здесь опять же можно чего-нибудь помутить с функцией GetTickCount(). Она возвращает количество миллисекунд, прошедших с момента старта системы.
0
alex_x_x
бжни
2454 / 1660 / 134
Регистрация: 14.05.2009
Сообщений: 7,162
11.02.2011, 00:07 #10
ну вот поэтому с такими тонкостями настройки генератора я предпочел что-нибудь готовое, например из boost'а
0
11.02.2011, 00:07
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.02.2011, 00:07
Привет! Вот еще темы с решениями:

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

Массив и рандом
2. Дан одномерный массив, состоящий из N целочисленных элементов....

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

не получается рандом
#include &quot;locale&quot; #include &quot;time.h&quot; #include &quot;stdio.h&quot; #include &quot;math.h&quot;...


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

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

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