Форум программистов, компьютерный форум CyberForum.ru

Сгенерировать случайные числа без повторений - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Билеты на метро - задача на оптимизацию http://www.cyberforum.ru/cpp-beginners/thread1304598.html
Пожалуйста, помогите решить задачку! Сразу предупреждаю, что решение с пятью циклами while не проходит по времени, так что не предлагайте его... Билет на одну поездку в метро стоит 15 рублей, билет на 5 поездок стоит 70 рублей, билет на 10 поездок стоит 125 рублей, билет на 20 поездок стоит 230 рублей, билет на 60 поездок стоит 440 рублей. Пассажир планирует совершить n поездок. Определите,...
C++ Найти треугольник наибольшей площади с вершинами в данных точках Дано натуральное число n. С помощью двумерного действительного числового массива i=1,2; j=1,...,n на плоскости задано n точек так, что x1j, x2j – координаты j-й точки. Найти треугольник наибольшей площади с вершинами в этих точках. Помогите пожалуйста дописать, не получается, заранее спасибо! #include <iostream> #include <cmath> using namespace std; int main() { http://www.cyberforum.ru/cpp-beginners/thread1304595.html
Найти площадь фигуры C++
Найти площадь фигуры F1=pow(x,2)+1 F2=3-pow(x,2) цикл while. Решение: #include <math.h> #include <stdio.h> #include <windows.h> int main()
Простой калькулятор и калькулятор с парсингом C++
Ребят я совсем не давно только начал изучать сишку, решил написать простенький калькулятор который работает с 2 числами. Возник вопрос, как сделать так чтобы можно было вводить 2 + 5 - 9... И тд. Если такая тема уже была скиньте ссыль, зарание благодарен! #include <iostream> #include <cmath> using namespace std; int main() { float a, b, s;
C++ Найти наибольший элемент двух массивов и записать единицу в тот ряд и столбец http://www.cyberforum.ru/cpp-beginners/thread1304556.html
Найти наибольший элемент двух массивов и записать единицу в тот ряд и столбец где они находятся. Помогите пожалуйста, не могу понять что не правильно в функции "changeArray". Мой код: #include "stdafx.h" #include <iostream> using namespace std; const int n = 6; const int m = 5;
C++ Задачи с циклами Не судите строго... Помогите пожалуйста сделать вот это Напишите задание руками и создайте три различных темы для решения трех разных задач подробнее

Показать сообщение отдельно
TheCalligrapher
С чаем беда...
Эксперт С++
 Аватар для TheCalligrapher
2782 / 1428 / 393
Регистрация: 18.10.2014
Сообщений: 2,622
19.11.2014, 01:58     Сгенерировать случайные числа без повторений
Цитата Сообщение от Zver6233 Посмотреть сообщение
Нужно выбрать 8 чисел в диапазоне от 1 до 16 включительно, чтоб они не повторялись.
Для таких небольших чисел идеально подойдет т.наз "алгоритм Кнута":

Итерируем через весь диапазон от 1 до 16. Принимаем решение брать/не брать число с вероятностью 'сколько осталось найти / сколько осталось просмотреть'

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
#include <iostream>
#include <ctime>
using namespace std;
 
int main()
{
  const unsigned RANGE_LO = 1;
  const unsigned RANGE_HI = 16;
  const unsigned N = 8;
 
  srand(time(NULL));
 
  unsigned a[N];
  unsigned i_a = 0;
 
  for (unsigned i = RANGE_LO; i <= RANGE_HI; ++i)
  {
    unsigned n_iterate = RANGE_HI - (i - RANGE_LO); // Осталось просмотреть
    unsigned n_find = N - i_a; // Осталось найти
 
    if (rand() < n_find * (RAND_MAX + 1) / n_iterate)
      // Берем!
      a[i_a++] = i;
  }
 
  for (unsigned i = 0; i < N; ++i)
    cout << a[i] << endl;
}
Такой алгоритм сгенерирует набор случайных не повторяющихся чисел в возрастающем порядке. Если еще нужно, чтобы и порядок был случайным, то числа следует после этого случайно перемешать: Массив случайных чисел, как сделать чтоб они не повторялись?
 
Текущее время: 19:34. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru