Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/32: Рейтинг темы: голосов - 32, средняя оценка - 4.56
 Аватар для TXLib.h
3 / 3 / 0
Регистрация: 01.12.2010
Сообщений: 68

Рандом

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

Студворк — интернет-сервис помощи студентам
возникла проблема - я создал массив, состоящий из десяти рандомных чисел. Только вот рандомными они становиться не хотят. Правда, на одном компе он выдаёт одну последовательность, на другом - другую, но при повторной (второй, десятой, тысячной) компиляции на одном и том же компе выдаётся одинаковый набор чисел - подскажите, в чём проблема?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.02.2011, 19:04
Ответы с готовыми решениями:

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

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

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

9
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
10.02.2011, 19:08
srand(time(0))

Добавлено через 43 секунды
Srand
rand() & srand()
1
 Аватар для TXLib.h
3 / 3 / 0
Регистрация: 01.12.2010
Сообщений: 68
10.02.2011, 19:20  [ТС]
спс. кстати, как сделать так, чтобы все числа в массиве различались и были рандомными?
сейчас же у нас работают строки
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
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
10.02.2011, 19:35
Цитата Сообщение от 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  [ТС]
в конце концов надо показать, какое число является максимальным.

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

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

Добавлено через 1 минуту
всё-всё понял.
в 17 строке я обнулил i.
0
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
10.02.2011, 20:25
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
3 / 3 / 1
Регистрация: 14.12.2010
Сообщений: 36
10.02.2011, 23:14
А можно еще подумать из какого распределения Вам нужны числа и сделать что-нибудь типа такого:
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
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
10.02.2011, 23:45
BlackStranger, генерация равномерно распределенной велечины + центральная предельная теорема
чтоб пользоваться такими вещами нужны и знания соответствующие
0
3 / 3 / 1
Регистрация: 14.12.2010
Сообщений: 36
11.02.2011, 00:01
чтоб пользоваться такими вещами нужны и знания соответствующие
Согласен. Для диплома эти функции делал. Но в целом можно просто добавить их в проект и использовать. Другое дело, что если нужно лабу какую-нибудь сделать... То преподу может не очень понравиться такой подход!

Добавлено через 12 минут
Но здесь опять же можно чего-нибудь помутить с функцией GetTickCount(). Она возвращает количество миллисекунд, прошедших с момента старта системы.
0
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
11.02.2011, 00:07
ну вот поэтому с такими тонкостями настройки генератора я предпочел что-нибудь готовое, например из boost'а
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.02.2011, 00:07
Помогаю со студенческими работами здесь

Рандом в С++
Привет! Может ли кто-нибудь объяснить как сделать рандом в С++, нужно сделать просто генератор числа от 2 до 9, помогите очень нужно,...

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

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

Использование рандом
Доброго времени суток. Нужно включить использование рандома #include &lt;cmath&gt; //... srand(static_cast&lt;unsigned...

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


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru