Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

Рандом - C++

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

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

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

рандом - C++
Нижно массив заполнить рандомом #include "stdafx.h" #include <iostream> int _tmain(int argc, _TCHAR* argv) { double a...

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

рандом - C++
подскажите что не так #include <iostream> #include <string> #include <vector> using namespace std; int main() ...

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

не получается рандом - C++
#include "locale" #include "time.h" #include "stdio.h" #include "math.h" #include "stdlib.h" int rando(); int main(void) ...

9
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
10.02.2011, 19:08 #2
srand(time(0))

Добавлено через 43 секунды
Srand
rand() & srand()
1
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;
}
0
alex_x_x
бжни
2450 / 1655 / 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++;
}
зачем это вообще в цикле?
0
TXLib.h
3 / 3 / 0
Регистрация: 01.12.2010
Сообщений: 68
10.02.2011, 19:49  [ТС] #5
в конце концов надо показать, какое число является максимальным.

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

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

Добавлено через 1 минуту
всё-всё понял.
в 17 строке я обнулил i.
0
alex_x_x
бжни
2450 / 1655 / 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;
}
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
бжни
2450 / 1655 / 84
Регистрация: 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
бжни
2450 / 1655 / 84
Регистрация: 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
Привет! Вот еще темы с ответами:

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

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

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

Рандом с шагом - C++
Всем доброго времени суток. Пытаюсь сделать программу, которая выдаёт рандомные числа, с помощью rand(), c определенным шагом. Изучаю язык...


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

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

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