Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/8: Рейтинг темы: голосов - 8, средняя оценка - 5.00
1 / 1 / 2
Регистрация: 02.02.2015
Сообщений: 42
1

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

30.03.2017, 00:05. Просмотров 1668. Ответов 4
Метки нет (Все метки)

Нужно получить числа от 0 до 15 в рандомном порядке, делаю так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
BOOL messageClass::ClsOnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
{
for (int i = 0; i < 16; i++)
    {
        int Rand = rand() % 15;
        arr[i] = Rand;
 
        for (int j = 0; j < 16; j++)
        {
            checkRand(Rand, arr, i, j);
        }
    }
    return 0;
}
 
int messageClass::checkRand(int & Rand1, int arr[16], int i, int j)
{
    if ((arr[j] == Rand1) && (j != i)) {
        Rand1 = rand() % 15;
        return checkRand(Rand1, arr, i, j);
    }
    return 0;
}
но в итоге числа повторяются, помогите, 100% есть способ легче
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.03.2017, 00:05
Ответы с готовыми решениями:

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

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

Генерация массива случайных чисел код выдаёт неправильный результат
Вот код : #include &lt;stdio.h&gt; #include &lt;iostream&gt; #include &lt;cstring&gt; #include &lt;cstdlib&gt;...

Запишите шесть строк, состоящих из двух случайных чисел типа int, которые не больше 10 и трех случайных чисел
Запишите шесть строк, состоящих из двух случайных чисел типа int, которые не больше 10 и трех...

4
С чаем беда...
Эксперт CЭксперт С++
6592 / 3284 / 893
Регистрация: 18.10.2014
Сообщений: 6,449
30.03.2017, 02:01 2
Лучший ответ Сообщение было отмечено ZZnick как решение

Решение

Цитата Сообщение от ZZnick Посмотреть сообщение
Нужно получить числа от 0 до 15 в рандомном порядке
Уж миллион раз было

C++
1
2
3
4
5
6
for (int i = 0; i < 16; i++)
{
   int j = rand() % (i + 1);
   arr[i] = arr[j];
   arr[j] = i;
}
Все.

И никакого checkRand не надо (что у вас в нем происходит - не понятно).
3
Эксперт C
23418 / 14666 / 3087
Регистрация: 24.12.2010
Сообщений: 31,232
30.03.2017, 08:00 3
Генерация массива целых случайных чисел, которые не повторяются
1
С чаем беда...
Эксперт CЭксперт С++
6592 / 3284 / 893
Регистрация: 18.10.2014
Сообщений: 6,449
30.03.2017, 10:23 4
По части самих алгоритмов генерации (им там в первом сообщении два) там написана какая-то дичь, существование которой оправдать не получается ни с каких позиций. Это что-то из разряда "те, кто не знает, что такое велосипед, обречены изобрести его с нуля, причем плохо".

В случае, когда размер случайного диапазона M совпадает с размером массива N - банальный алгоритм Фишера-Йетса (см. выше) из трех-четырех строчек мгновенно дает требуемый результат в один проход и без дополнительной памяти. Применять алгоритмы по ссылке для этих целей - это будет тихий ужас.

В случае, когда размер случайного диапазона M не сильно больше размера массива N, можно применить тот же самый алгоритм Фишера-Йетса в виде цикла по M, при этом просто помня, что писать в массив по индексам больше N нельзя. Первый алгоритм по ссылке будет работать в этой задаче плохо, а второй алгоритм по ссылке тоже работает за O(M) и еще и требует O(M) дополнительной памяти (!). Зачем и кому он такой нужен?

Первый алгоритм про ссылке еще имеет право на существование, если M сильно больше N. Но и для этого есть намного более эффективные и простые алгоритмы!
1
0 / 0 / 0
Регистрация: 27.11.2019
Сообщений: 11
30.03.2020, 19:40 5
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Уж миллион раз было
Извините, подскажите и мне, пожалуйста, мне задали похожее задание ,только тут псевдорандом, и 10 чисел в массиве, вставляя ваш алгоритм, происходит несуразица какая-то.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
int main() {
int X[10];
int a;
int b;
 cin >>a;
 cin >>b;
srand(time_t(0));
    for (int i = 0; i < 10; i++)
    {
         j = a + rand() % (b-a+1);
         X[i] = X[j];
         X[j] = i;
         cout << X[i] << " ";
    }
}
Можно ли сюда что-то другое впихнуть? По условию рандом должен быть именно такой.Спасибо заранее.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.03.2020, 19:40

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Сформировать массив случайных целых чисел и поменять местами элементы массива 1 с 10 и т.д
Такая вот задачка: Сформировать массив А из 10 случайных целых чисел в диапазоне от -50 до +50 и...

Дано 2 массива A и В, целых чисел. Нужно посчитать количество тех чисел которые A[i]>B[i]
Дано 2 массива A и В, целых чисел. Нужно посчитать количество тех чисел которые A&gt;B Как вообще это...

Создать массив из 10 случайных целых чисел из отрезка; вывести значение минимального элемента массива
Написать программу, создающую массив из 10 случайных целых чисел из отрезка . Вывести на экран весь...

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


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

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

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