Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Другие темы раздела
C (СИ) Динамическое выделение памяти для двумерного массива https://www.cyberforum.ru/ c-beginners/ thread44166.html
Здравствуйте! В следующей программе я пытаюсь выделить динамически память для двумерного массива. Размерности массива задаются в качестве аргументов командной строки. В процессе выполнения...
C (СИ) Найти элемент, наиболее близкий к среднему значению всех элементов массива
Дан массив целых чисел. Найти элемент , наиболее близкий к среднему значению всех элементов массива.. Вот мой код, Наверняка есть попрроще #include<stdio.h> #include<math.h> main() { int...
C (СИ) Вывести все номера элементов, оканчивающиеся цифрой 0
Дан двухмерный массив целых чисел.Вывести все номера элементов, оканчивающиеся цифрой 0, если таких элементов нет, вывести соответствующие сообщение. #include<stdio.h> main() { int...
C (СИ) Сравнить первый и второй элементы массива Дан двухмерный массив. Сравнить первый и второй элементы массива. Если второй элемент меньше первого, то поменять их местами..Затем то же сделать со вторым и третьим........, предпоследним и... https://www.cyberforum.ru/ c-beginners/ thread43603.html
C (СИ) Конкатенация строк: В конец исходной строки дописывается мусор https://www.cyberforum.ru/ c-beginners/ thread43424.html
доброго времени суток.надо написать функцию которая делает конкатенацию строк. функцию написал,но в конец исходной строки дописывается мусор, подскажите как можно этот мусор убрать??если бы это был...
C (СИ) Как правильнее использовать main ()
#include "stdafx.h" #include <windows.h> #include <stdio.h> #include <time.h> #include <iostream> using namespace std; void main() {
Ввод\вывод массива через функции C (СИ)
Помогите плз исправить) Нужно осуществить ввод\вывод массива #include "stdio.h" #include "conio.h" #define N 10 #define M 10 void output (int n, int m,float a ); void input (int n, int m,...
C (СИ) Осуществить поиск по категории, удаление по номеру телефона абонента Здравствуйте! У меня есть программа, но она работает не так как нужно. Требуется организовать добавление, хранение, поиск, просмотр, удаление элементов структуры в виде списка: в моём случае нужно... https://www.cyberforum.ru/ c-beginners/ thread42168.html
C (СИ) Добавление символов в переменную строкового типа https://www.cyberforum.ru/ c-beginners/ thread42167.html
нашел вот такой пример:void strcat_char(char *str, char ch) { while (str) str++;//доходим до конца строки *str = ch;//пишем в конец строки } но компилятор BCC выдает null, NULL pointer assigment
C (СИ) Поиск последовательности в файле Приветствую всех, всем доброго времени суток. Возникла проблема в ходе работы с файлами. Расскажу немного о работе программы: Исходные данные: 2 текстовых файла; Что необходимо сделать:... https://www.cyberforum.ru/ c-beginners/ thread42148.html
Эксперт С++
7170 / 3228 / 77
Регистрация: 17.06.2009
Сообщений: 14,166
0

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

22.07.2009, 19:31. Просмотров 109893. Ответов 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-u.ac.jp/~m-mat/MT/SFMT/index.html


Вернуться к обсуждению:
Генерация массива целых случайных чисел, которые не повторяются
57
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.07.2009, 19:31
Готовые ответы и решения:

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

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

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

Генерация случайных целых чисел в заданном интервале
Здравствуйте! Правильно ли я прописал код случайных чисел от -1 до 2 ??? Спасибо. procedure...

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