С Новым годом! Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.70/729: Рейтинг темы: голосов - 729, средняя оценка - 4.70
Эксперт С++
 Аватар для odip
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164

Генерация массива целых случайных чисел, которые не повторяются

22.07.2009, 19:31. Показов 143008. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Случайные числа.
Генерация случайного целого числа в заданном диапазоне.
Генерация массива целых случайных чисел, которые не повторяются.

Функция rand() возвращает псевдослучайное число в интервале от 0 до RAND_MAX.
Но при запуске программы вы всегда будете всегда получать одну и ту же последовательность чисел. Чтобы этого не происходило следует с помощью функции srand() инициализировать генератор случайных чисел с помощью некоторого начального случайного значения.
Например: srand( time( NULL ) ).

Генерация случайного целого числа в заданном диапазоне.

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
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
int gen_random( int range_min, int range_max );
 
/* ================================================================ */
int main( int argc, char *argv[] ) {
    
int range_min, range_max, rand_val;
 
 
srand( time( NULL ) );
 
if ( argc!=1+2 ) {
    fprintf( stderr, "Usage: gen_random range_min range_max\n" ); exit( 1 );
}
 
range_min= atoi( argv[1] );
range_max= atoi( argv[2] );
rand_val= gen_random( range_min, range_max );
 
printf( "random value in range [%d;%d] is %d\n", range_min, range_max, rand_val );
 
return 0;
 
} /* main() */
 
/* ================================================================ */
int gen_random( int range_min, int range_max ) {
 
if ( range_min>range_max ) {
    fprintf( stderr, "gen_random(): Invalid arguments\n" ); exit( 1 );
}
 
return range_min+rand()%(range_max-range_min+1);
    
} /* gen_random() */


Генерация массива целых случайных чисел, которые не повторяются.

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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
#define MAX_ARR_SIZE    1024
 
void gen_random_uniq( int arr_size, int *parr, int range_min, int range_max );
 
/* ================================================================ */
int main( int argc, char *argv[] ) {
 
int i, arr_size;
int arr[MAX_ARR_SIZE];
int range_min, range_max;
 
 
srand( time( NULL ) );
 
if ( argc!=1+3 ) {
    fprintf( stderr, "Usage: gen_random_uniq arr_size range_min range_max\n" ); exit( 1 );
}
arr_size= atoi( argv[1] );
range_min= atoi( argv[2] );
range_max= atoi( argv[3] );
if ( arr_size<0 || arr_size>MAX_ARR_SIZE ) {
    fprintf( stderr, "Invalid array size\n" ); exit( 1 );
}
gen_random_uniq( arr_size, arr, range_min, range_max );
 
printf( "random unique array: array size is %d, range is [%d;%d]\n",
    arr_size, range_min, range_max
);
for ( i= 0; i<arr_size; i++ ) {
    printf( " %d", arr[i] );
}
printf( "\n" );
 
return 0;
 
} /* main() */
 
/* ================================================================ */
void gen_random_uniq( int arr_size, int *parr, int range_min, int range_max ) {
 
int i, j;
int dup_flag;
int rand_val, range_width= range_max-range_min+1;
 
 
if ( range_width<1 || arr_size<0 || arr_size>range_width ) {
    fprintf( stderr, "gen_random_uniq(): Invalid arguments\n" ); exit( 1 );
}
 
for ( i= 0; i<arr_size; i++ ) {
    for ( ; ; ) {
        rand_val= range_min+rand()%range_width;
        dup_flag= 0;
        for ( j= 0; j<i; j++ ) {
            if ( rand_val == parr[j] ) { dup_flag= 1; break; }
        }
        if ( !dup_flag ) { break; }
    }
    parr[i]= rand_val;
}
    
} /* gen_random_uniq() */


Генерация массива целых случайных чисел, которые не повторяются (быстрый алгоритм).

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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
#define MAX_ARR_SIZE    10240
 
void gen_random_uniq2( int arr_size, int *parr, int range_min, int range_max );
 
/* ================================================================ */
int main( int argc, char *argv[] ) {
 
int i, arr_size;
int arr[MAX_ARR_SIZE];
int range_min, range_max;
 
 
srand( time( NULL ) );
 
if ( argc!=1+3 ) {
        fprintf( stderr, "Usage: gen_random_uniq2 arr_size range_min range_max\n" ); exit( 1 );
}
arr_size= atoi( argv[1] );
range_min= atoi( argv[2] );
range_max= atoi( argv[3] );
if ( arr_size<0 || arr_size>MAX_ARR_SIZE ) {
        fprintf( stderr, "Invalid array size\n" ); exit( 1 );
}
gen_random_uniq2( arr_size, arr, range_min, range_max );
 
printf( "random unique array: array size is %d, range is [%d;%d]\n",
        arr_size, range_min, range_max
);
for ( i= 0; i<arr_size; i++ ) {
        printf( " %d", arr[i] );
}
printf( "\n" );
 
return 0;
 
} /* main() */
 
/* ================================================================ */
void gen_random_uniq2( int arr_size, int *parr, int range_min, int range_max ) {
 
int i, arr2_size, index, range_width;
int *parr2= NULL;
 
 
/* Check arguments */
range_width= range_max-range_min+1;
if ( range_width<1 || arr_size<0 || arr_size>range_width ) {
        fprintf( stderr, "gen_random_uniq2(): Invalid arguments\n" ); exit( 1 );
}
if ( arr_size == 0 ) { return; }
 
 
/* Alloc */
parr2= (int*)malloc( range_width*sizeof(int) );
if ( parr2 == NULL ) {
    fprintf( stderr, "gen_random_uniq2(): No enough memory\n" ); exit( 1 ); 
}
 
/* Init */
for ( i= 0; i<range_width; i++ ) {
    parr2[i]= range_min+i;
}
 
/* Loop */
arr2_size= range_width;
for ( i= 0; i<arr_size; i++ ) {
    index= rand()%arr2_size;
    parr[i]= parr2[index];
    arr2_size--;
    parr2[index]= parr2[arr2_size];
}
 
/* Free */
if ( parr2 != NULL ) { free( parr2 ); parr2= NULL; }
 
} /* gen_random_uniq2() */


Если не подходит стандартный rand().

Дополнительная информация.
http://ru.wikipedia.org/wiki/Г... йных_чисел

Популярный генератор псевдослучайных чисел.
SIMD-oriented Fast Mersenne Twister (SFMT).
SFMT генерирует 128-битные целые псевдослучайные числа в один шаг.
dSFMT напрямую генерирует вещественные (double) псевдослучайные числа.
http://www.math.sci.hiroshima-... index.html
57
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.07.2009, 19:31
Ответы с готовыми решениями:

Генерация массива целых случайных чисел, которые не повторяются
Нужно получить числа от 0 до 15 в рандомном порядке, делаю так: BOOL messageClass::ClsOnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM...

Вычислить сумму всех чисел массива, которые повторяются и произведение всех чисел, которые не повторяются
Задано массив целых чисел A(n), n=&lt;500. Разработать программу, которая вычисляет сумму всех чисел, которые повторяются и произведение всех...

Из массива целых случайных чисел получить массив из чисел, которые встречаются более одного раза
Из массива целых случайных чисел X=(x i) где i=(1,2,..n) получить массив Y=(y(m)),из чисел которые встречаются более одного раза....

4
 Аватар для Monte-Cristo
2816 / 1408 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
26.07.2009, 22:05
К слову, rand() генерирует машиннозависимую последовательность. То есть, при каждом запуске на конкретной машине (компьютере) у вас будет генерироваться одна и та же последовательность чисел. Поэтому очень часто применяют srand() который позволяет задать последовательность на основе некого числа (ключа). Как правило, для имитации действительно случайных чисел, в качестве ключа srand() задают текущее време системы: srand(time(NULL));
13
Эксперт С++
 Аватар для odip
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
26.07.2009, 22:11  [ТС]
Даже если использовать srand(), то все равно rand() будет выдавать псевдослучайные числа. Это следует из самого алгоритма работы rand().
Для генерации действительно случайных чисел нужно использовать аппаратные генераторы.
5
MCSD: APP BUILDER
 Аватар для IT_Exp
8795 / 1074 / 104
Регистрация: 17.06.2006
Сообщений: 32,602
04.08.2009, 20:19
Генерация случайного числа любой длины.
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
#include <windows.h>
#include <bcrypt.h>
 
#pragma comment(lib, "bcrypt.lib")
 
template <typename T>
void Generate(T& v)
{
    BCRYPT_HANDLE hAlgo = NULL;
    BCryptOpenAlgorithmProvider(&hAlgo, BCRYPT_RNG_ALGORITHM, NULL, 0);
    BCryptGenRandom(hAlgo, reinterpret_cast<PUCHAR>(&v), sizeof(v), 0);
    BCryptCloseAlgorithmProvider(hAlgo, 0);
}
 
#pragma pack(push, 1)
struct LargeData
{
    BYTE raw_[100];
};
#pragma pack(pop)
 
int main()
{
    // Генерация случайного GUID'а
    GUID guid;
    memset(&guid, 0, sizeof(guid));
    Generate(guid);
 
    // Генерация случайного числа размером 100 байт
    LargeData data;
    memset(&data, 0, sizeof(data));
    Generate(data);
 
    return (0);
}

Требуется:
- для компиляции - Windows SDK v6 или выше
- для запуска - Windows Vista или выше

Генерация случайных чисел в диапазоне [a.. b] с использованием генератора Mersenne Twister.
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
#include <time.h>
#include <iostream>
#include <boost/random.hpp>
 
template <typename EngineT, typename DistributionType=int>
struct CRandomT
{
    typedef boost::uniform_int<DistributionType> distribution_type;
    typedef typename distribution_type::result_type result_type;
 
    CRandomT(result_type a, result_type b) : 
    gen_(
        EngineT(static_cast<result_type>(time(NULL))),
        distribution_type(a, b)
        )
    {
    };
    result_type operator()()
    {
        return gen_();
    }
    boost::variate_generator<EngineT, distribution_type> gen_;
};
 
int main()
{
    // Генерация случайного числа в диапазоне [1 .. 10]
    typedef CRandomT<boost::mt19937> CRandom;
    CRandom rnd(1, 10);
    for (int i=0; i<10; i++)
        std::cout << rnd() << std::endl;
 
    return (0);
}

Требуется:
- библиотека Boost.Random
15
Эксперт С++
 Аватар для odip
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
05.04.2011, 16:43  [ТС]
Генерация случайного числа на UNIX/Linux/BSD с помощью /dev/urandom

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
 
int main( void ) {
 
int fd;
long val;
 
fd= open( "/dev/urandom", O_RDONLY );
 
read( fd, &val, sizeof(val) );
printf( "%ld\n", val );
 
return 0;
 
} /* main() */


Отличия между /dev/random и /dev/urandom

/dev/random и /dev/urandom — специальные символьные псевдоустройства в некоторых UNIX-подобных системах, впервые появившиеся в ядре Linux версии 1.3.30. Они предоставляют интерфейс к системному генератору случайных чисел, который выводит шумы из драйверов устройств и других источников в «хаотичный» пул (англ. entropy pool). Генератор также сохраняет необходимое количество битов шума в этом пуле и формирует из него случайные числа.

При чтении данных в устройстве /dev/random создаются только случайные байты, состоящие из битов шума «хаотичного» пула. Устройство /dev/random может быть необходимо пользователям, которые требуют очень высокого коэффициента случайности, например, при создании ключа доступа и т. п. Если «хаотичный» пул опустел, чтение /dev/random блокируется, пока необходимое количество битов в пуле не будет создано.

Чтение данных устройства /dev/urandom возвратит столько байтов, сколько было запрошено. В результате, если в пуле было недостаточно битов, теоретически возможно будет найти уязвимость алгоритма, использующего это устройство. Если это важно, следует использовать /dev/random.

Взято отсюда: http://ru.wikipedia.org/wiki//... ev/urandom


Идея добавить /dev/urandom принадлежит gGrn-7DA
8
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.04.2011, 16:43
Помогаю со студенческими работами здесь

Генерация случайных целых чисел в заданном интервале
Здравствуйте! Правильно ли я прописал код случайных чисел от -1 до 2 ??? Спасибо. procedure TForm1.FormCreate(Sender: TObject); var...

Генерация случайных целых чисел из заданного диапазона значений, чтобы получить заданную сумму
Генерация случайных целых чисел из заданного диапазона значений, чтобы получить заданную сумму. Есть число (сумма), его нужно разбить на...

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

Генерация массива случайных чисел
Начал свое знакомство с haskell, но наступил ступор, когда понадобилось решить задачу, для которой необходимо написать функцию, которая...

Генерация массива случайных чисел
помогите пожалуйста ! нужно написать функцию которая будет генирировать числа от 1 до 60 и записовать их в массив при условии того чтоб...


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

Или воспользуйтесь поиском по форуму:
5
Закрытая тема Создать тему
Новые блоги и статьи
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru