Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » С/С++ | Выбор 10 случайных элементов из массива

Ответить
Настройки темы
С/С++ | Выбор 10 случайных элементов из массива

Новый участник


Сообщения: 10
Благодарности: 0

Профиль | Отправить PM | Цитировать


Надо реализовать такую штуку.
Имееться масив на (макс) 200 чисел
Заполняеться просто от 1 до 200, надо что бы прога выдала 10 из них полным рендомом, причём что бы не повторялись, кто знает как это сделать на с++ а ещё лучше в с++ builder 6.0.

Отправлено: 19:48, 28-08-2006

 

Аватара для Cyberhawk

Пользователь


Сообщения: 149
Благодарности: 7

Профиль | Отправить PM | Цитировать


Цитата:
надо что бы прога выдала 10 из них полным рендомом
Первые 10 или вообще? Если вообще, то как ты узнаешь, какие именно 10 выданы рандомом, а какие заполнены каким-то другим образом?
Короче, я толком не понял даже формулировки задачи. И какой диапазон у членов массива? И что значит
Цитата:
Имееться масив на (макс) 200 чисел
? Произвольный размер что ли?
Короче, ждем конкретизации задачи.

Отправлено: 20:21, 28-08-2006 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для XCodeR

Ветеран


Сообщения: 878
Благодарности: 53

Профиль | Сайт | Отправить PM | Цитировать


Vovius

Цитата:
Заполняеться просто от 1 до 200
в С++ нумерация идет с 0, а не с 1.

Допустим исходный массив mass.

Цитата:
int randoms[10],ri;
Randomize();
for(int i=0;i<10;i++)
{
ri=RandomRange(0,199);
randoms[i]=mass[ri];
}

Не забудьте подключить библиотеку Math.

Отправлено: 20:55, 28-08-2006 | #3

pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


Код: Выделить весь код
#include <vector>
#include <cstdlib>

int main()
{
  // >> Надо реализовать такую штуку.
  // >> Имееться масив на (макс) 200 чисел
  std::vector<double> array1(200);

  // >> Заполняеться просто от 1 до 200, 
  for(unsigned n=0; n<array1.size(); +n) array1[n] = n + 1;

  // >> надо что бы прога выдала 10 из них полным рендомом, 
  std::randomize();
  for(unsigned n=0; n<10; ++n)
  {
    unsigned rand_index = std::random(array1.size());
    std::cout << array1[rand_index] << std::endl;

    // >> причём что бы не повторялись, 
    std::vector<double>::iterator i = array1.begin();
    std::advance(i, rand_index);
    array1.erase(i);
  }

  // >> кто знает как это сделать на с++ а ещё лучше в с++ builder 6.0.
  // работает с любым компилятором C++ 3.3.2 под любую ОС
  return 0;
}
Это сообщение посчитали полезным следующие участники:

Отправлено: 06:44, 29-08-2006 | #4


Новый участник


Сообщения: 10
Благодарности: 0

Профиль | Отправить PM | Цитировать


Cyberhawk
Ну вот видьшь ниже всё народ понял.

XCodeR
Спасибо за команду для рандома.

pva
Спасибо полезный исходник.

Отправлено: 13:10, 29-08-2006 | #5


редкий гость


Сообщения: 1696
Благодарности: 44

Профиль | Сайт | Отправить PM | Цитировать


pva
Небольша опечатка, должно быть
Код: Выделить весь код
for(unsigned n=0; n<array1.size(); ++n) array1[n] = n + 1;
А ещё можно воспользоваться random_shuffle. Правда, если нужны только 10 элементов из 200 это будет слегка оверкилл. С другой стороны, он гарантированно линейный от размера массива (т.е. будет сделано 200 перестановок), а вариант pva, если ничего не путаю имеет сложность O(m*n) в худшем/среднем случае, где n - число требуемых элементов, а m - размер массива.

Ещё такое придумалось:
Код: Выделить весь код
std::vector<int> array; //считаем, что как-то уже заполнено
std::set<size_t> used;
std::list<int> out;

for (size_t i = 0; i < n; ++i)
{
    size_t j = rand() % array.size();
    while (used.find(j) != used.end())
        j = (j+1) % array.size();
    out.push_back(array[j]);
    used.insert(j);
}
Идея сводится к тому, что просто храним список использованных ключей. Если выпадает уже использованный, то перебираем все за ним следующие на предмет нахождения неиспользованного. Худший случай - O(n*n*logn), лучший - O(n*log n). Если n << m, то средний по идее стремится к лучшему.

Но вариант с rand_shuffle всё равно мне нравится больше. Своей краткостью.

upd Поправил заголовок темы. Прошу в будущем давать более содержательные названия.

-------
http://ivank.ru


Последний раз редактировалось ivank, 29-08-2006 в 23:41.


Отправлено: 19:37, 29-08-2006 | #6



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » С/С++ | Выбор 10 случайных элементов из массива

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Установка ActiveX элементов. minion Microsoft Windows NT/2000/2003 0 07-04-2009 16:41
CSS выравнивание элементов maaxiim Вебмастеру 14 19-06-2008 21:22
Поиск элементов массива, чья сумма равна заданному числу Qwe1 Программирование и базы данных 28 26-09-2006 03:31
Генератор случайных чисел Murrey Хочу все знать 3 22-08-2006 13:00
Исчезновение элементов автозагрузки Black_Devil Microsoft Windows 2000/XP 4 05-02-2006 15:00




 
Переход