Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Есть два числа. Нужно найти все числа между ними, Случайным образом! 
:(
    Опции темы
Wowa
Дата 13.11.2005, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

Репутация: нет
Всего: 290



Есть два числа. Нужно найти все числа между ними, но случайным образом! Т.е. через Math.random.
Числа не должны повторятся.

И при генерировании нового случайного числа, не допускается переборка всего массива с целью проверки было ли это число уже найдено или нет.


Давайте подумаем над этим алгоритмом.

У меня есть такие идеи: нужно найти разницу между числами А и Б. Создать массив этой длины.
И просто потом генерировать числа и записывая их в нужные ячейки массива.
PM WWW   Вверх
cardinal
Дата 13.11.2005, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 5
Всего: 99



То есть числа целые как я понял (1, 2, 3 и т.д.)?

Тогда надо как бы умножать то, что возвращает Math.random, то есть надо знать диапазон чисел. И так вопрос smile чсила идут от 1 до 10, от 10 до 100 или как?


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
hiHo
Дата 13.11.2005, 16:53 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered












Попробуй так

Пример у тебя числа с М1 по М2

1) Копируешь все по порядку в массив (длинна массива М2-М1+1) .
2) Берешь случайный на его место ставишь последний количество уменьшаешь на 1.
3) и тд пока массив не станит пустым.
  Вверх
Wowa
Дата 13.11.2005, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

Репутация: нет
Всего: 290



Цитата(cardinal @ 13.11.2005, 14:44)
чсила идут от 1 до 10, от 10 до 100 или как?

да, как угодно могут идти. Как задать, так и будут идти.

Числа - целые.
Добавлено @ 16:55
Цитата(cardinal @ 13.11.2005, 14:44)
Тогда надо как бы умножать то, что возвращает Math.random

На что умножать?
PM WWW   Вверх
sergejzr
Дата 13.11.2005, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 4
Всего: 360



насчёт массива - правильно. В нём отмечать числа, которые уже найдены. Только вот придётся имхо сегменты вводить. то есть первое найденное число разобьёт диапазон на 2 сегмента, второе на 3 или останется 2. Если исключим 0, то ксор границ даст 0 , если диапазон заполнен полностью. Короче мудрённый алгоритм получится. Не знаю, стоит ли овчинка выделки.

А вот простой алгоритм ты описал вроде. грубо говоря:

Код

  int cnt=0;//найденные числа
  int min=5,max=15;
  int interval=max-min;
  while(cnt<interval)  
  {
    int r;
    for(r=random(max,min); massiv[r]; r=random(max,min));
    massiv[r]=true;//нашли очередное число
    cnt++;
 }


конечно под конец находить будет долго, но это самое простое решение. Игаче надо думать про сегменты..


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Wowa
Дата 13.11.2005, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

Репутация: нет
Всего: 290



Цитата(sergej @ 13.11.2005, 14:55)
Игаче надо думать про сегменты..

ну, сегменты не самое страшное. Но у меня нет мыслей, как их тут использовать.
PM WWW   Вверх
Akina
Дата 13.11.2005, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 20
Всего: 454



создаем двумерный массив
Код
dim Array(0 to 1, MinNum to MaxNum)
заполняем
Код
for i = MinNum to MaxNum
    Array(0,i) = Random
    Array(1,i) = i
next i
сортируем по 0-му столбцу
Код
Array.Sort(0,Ascending)
выводим результат
Код

for i = MinNum to MaxNum
    Print Array(1,i)
next i



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
cardinal
Дата 13.11.2005, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 5
Всего: 99



Цитата(Wowa @ 13.11.2005, 14:25)
Нужно найти все числа между ними, но случайным образом!

Akina, а ты предлагаешь не искать их случайным образом, а расбросать случайным образом. smile

Но вообще очень хитро! smile

Если Wow'у устроит разбрасывание чисел, то почему бы и нет...
Добавлено @ 20:16
Цитата(Wowa @ 13.11.2005, 14:54)
На что умножать?

Ну на 10, на 100... Просто привык, что Random возвращает числа в интевале 0..1.


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
Rick
Дата 13.11.2005, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 4.11.2005
Где: Новосибирск

Репутация: нет
Всего: 3



идеально подходят множества, но всего от 0 до 255
--------------------
Не бывает атеистов в окопах под огнем   
PM MAIL ICQ   Вверх
Graf Zeppelin
Дата 13.11.2005, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 28.3.2004

Репутация: нет
Всего: 1



А может через генерацию списка и выбора с удалением?
--------------------
Jah, help me!
PM MAIL   Вверх
Wowa
Дата 13.11.2005, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

Репутация: нет
Всего: 290



Цитата(Graf @ 13.11.2005, 20:23)
А может через генерацию списка и выбора с удалением?

а подробннее? Как удаление делать будешь, если не допускается перебор всего массива.
PM WWW   Вверх
Akina
Дата 13.11.2005, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 20
Всего: 454



Цитата(cardinal @ 13.11.2005, 21:15)
ты предлагаешь не искать их случайным образом, а расбросать случайным образом

ясен пень... просто условия
Цитата(Wowa @ 13.11.2005, 17:25)
Нужно найти все числа между ними, но случайным образом!
и
Цитата(Wowa @ 13.11.2005, 17:25)
не допускается переборка всего массива с целью проверки было ли это число уже найдено или нет
с учетом упора на выделенное противоречат друг другу.

И вообще в контексте задачи я не понимаю термина "найти"... вывести все, но в случайном порядке? мой алгоритм это делает... что-то другое? объясните что именно, у меня фантазии не хватает.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Wowa
Дата 13.11.2005, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

Репутация: нет
Всего: 290



Цитата(Akina @ 13.11.2005, 20:35)
с учетом упора на выделенное противоречат друг другу.

почему противоречат? smile
PM WWW   Вверх
Akina
Дата 13.11.2005, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 20
Всего: 454



Цитата(Wowa @ 13.11.2005, 23:38)
почему противоречат?

Почему? потому что очередное сгенерированное СЛУЧАЙНО число из заданного диапазона имеет право быть найденным ранее. А проверить так это или нет можно только сравнением с ранее найденными, т.е. сканирование найденных. Противоречие.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Wowa
Дата 13.11.2005, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

Репутация: нет
Всего: 290



Цитата(Akina @ 13.11.2005, 20:43)

Почему? потому что очередное сгенерированное СЛУЧАЙНО число из заданного диапазона имеет право быть найденным ранее. А проверить так это или нет можно только сравнением с ранее найденными, т.е. сканирование найденных. Противоречие.

противоречия нет. Если первое число 100, а второе 200. То создаем массив на 100 элементов. Обнуляем его.
И если какое-то число найдено, то пишем его в массив по индексу этого самого числа, если же array[random]!=0

Где тут противоречие? smile Ключевое слово было:

Цитата(Wowa @ 13.11.2005, 14:25)
не допускается переборка всего массива


Или же второй вариант - поиграть с знаками больше, меньше при нахождении чисел...



PM WWW   Вверх
neutrino
Дата 14.11.2005, 00:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Gothic soul
****


Профиль
Группа: Модератор
Сообщений: 3041
Регистрация: 25.3.2002
Где: Верхняя Галилея, Кармиэль

Репутация: нет
Всего: 62



Привет!

Может Г.А??? Операция кросовера как раз разнообразит геном... А отбирать надо наиболее разнообразные. Но это только для сравнительно больших диапазонов чисел.


--------------------
The truth comes from within ...

Покойся с миром, Vit 
PM MAIL WWW ICQ Skype GTalk   Вверх
sergejzr
Дата 14.11.2005, 00:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 4
Всего: 360



Akina, я немного не понял твоей идеи, поэтому возможно продублирую..

Вроде получилось оптимально и без ужасов smile

Идея: есть "мешок" с числами достаём оттуда в случайном порядке, но не кладём числа обратно в мешок.
Алгоритм:
массив из n чисел (n = max - min)
в случайном порядке находится не число, а индекс в этом массиве от 0 - n. Искомое число - число по этому индексу.
Забрали число, на его место ставим последнее, массив таким образом сокращается на один элемент.

Код

#include "iostream.h"
#include "math.h"
#include<stdlib.h>

/*начальная инициализация массива. Каждое число соответствует своему индексу */
void init(int * pool,int interval)
{
    for(int i=0;i<interval;i++)pool[i]=i;
}

/*pool - мешок с числами, ind - случайный индекс. border - конец мешка*/
int get(int*pool,int ind,int border)
{
int ret=pool[ind];//возвращаемое число
if (ind!=border) pool[ind]=pool[border]; //кладём последнее число массива на место. где стояло искомое.

return ret;
}



int main()
{
    
 int min=10; 
 int max=100;
 int interval=max-min;
 int * pool = new int[interval];//До сих пор понятно. 
 
 init(pool,interval);

 interval--; //чтобы индекс правильный был
 for(;interval>0;interval--)
 {
    int random=rand(); 
    int ind=random%interval;//ставим случайное число в интервал нашего мешка

    //так как случайные числа лежат от 0 до interval, добавляя min возвращаем в искомый интервал 
    cout<<min+get(pool,ind,interval-1)<<" "<<endl;
    
 }
  return 0;
}


Акина, разобрался с твоим алгом. Но если
Array(0,i) = Random
Несколько раз даст один и тот же результат?


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Wowa
Дата 14.11.2005, 01:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

Репутация: нет
Всего: 290



есть еще одно условие: "Числа не должны повторяться".
Добавлено @ 01:14
sergej.z а чем к примеру, твой алгоритм лучше моего?
Добавлено @ 01:16
Насколько я понял, твой вариант быстрее, т.к. нет вероятности того, что "выпадет" тоже самое число.
PM WWW   Вверх
sergejzr
Дата 14.11.2005, 01:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 4
Всего: 360



Мой алгоритм линеарный. Без циклов совсем. O(n). Самое сложное действие - % на 32 такта smile.
ИМХО - оптимальное решение.

Гы smile Ещё раз в компактной форме:
Код

#include "iostream.h"
#include<stdlib.h>


int main()
{
    
 int min=10;
 int max=100;
 int interval=max-min;
 int * pool = new int[interval];
 
 for(int i=0;i<interval;i++)pool[i]=i; //инициализация

 interval--;
 for(;interval>0;interval--)
 {
     int ind=rand()%interval; //случайный индекс массива
     cout<<min+pool[ind]<<" "<<endl;
         pool[ind]=pool[interval-1]; //последнее число на место "изъятого"
 }
  return 0;
}



--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
sergejzr
Дата 14.11.2005, 01:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 4
Всего: 360



Гы smile только что прочитал всю тему. Уже до меня, пока я на танцы ходил smile, этот или примерно такой вариант предлагали hiHo и, как я понял, Graf Zeppelin


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Akina
Дата 14.11.2005, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 20
Всего: 454



Цитата(sergej @ 14.11.2005, 01:25)
если
Array(0,i) = Random
Несколько раз даст один и тот же результат?

Гы... smile
Начинающий программист: Я тут написАл программу, но она не работает, где ошибка?
Опытный программист: В генах...


Цитата(sergej @ 14.11.2005, 01:25)
есть "мешок" с числами достаём оттуда в случайном порядке, но не кладём числа обратно в мешок. Забрали число, на его место ставим последнее

при этом числа действительно будут в случайном порядке, но, увы, рандом будет неравномерным... вероятность последних чисел быть "первее" в выборке будет выше, чем первых... надо сдвигать, а не переносить последнее.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Wowa
Дата 14.11.2005, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

Репутация: нет
Всего: 290



Цитата(Akina @ 14.11.2005, 09:05)
надо сдвигать, а не переносить последнее.

сдвигать - это уже совсем другая работа..
PM WWW   Вверх
sergejzr
Дата 14.11.2005, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 4
Всего: 360



Цитата(Akina @ 14.11.2005, 10:05)
вероятность последних чисел быть "первее" в выборке будет выше, чем первых..

Вероятность остаётся той же самой. ведь случайный индекс 0 - величина_мешка. От того, где какое число стоит, ничего практически не зависит.
Попробуй прогони програму 10 000 раз, никакой зависимости от сдвига не заметишь.
Даже наоборот, числа дополнительно "перемешиваются"


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
nworm
Дата 14.11.2005, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 502
Регистрация: 22.10.2005

Репутация: 4
Всего: 8



Как вариант можно попробовать линейный конгруэнтный метод.

Определения.

Используются следующие неотрицательные числа:

Xn, Xn >= 0 - начальное значение,
a, c, a > 0, c > 0,
m, m > X0, m > a, m > c - модуль.

Линейная конгруэнтная последовательность случайных чисел получается из соотношения

X(n+1) = (a*Xn + c) mod m, n >= 0.

Теорема. Длина периода линейной конгруэнтной последовательности равна m тогда и только тогда, когда
c и m взаимно просты, b = a - 1 кратно p для любого простого p, являющегося делителем m, b кратно 4, если m кратно 4.

Пример. m = 7, c = 1, a = 4, X0 = 5.
Последовательность
5
0=4*5+1 mod 7
1=0*5+1 mod 7
6=1*5+1 mod 7
3=6*5+1 mod 7
2=3*5+1 mod 7
4=2*5+1 mod 7
получили числа от 0 до 6

Правда, надо m раскладывать на множители...

Это сообщение отредактировал(а) nworm - 14.11.2005, 15:06
PM MAIL WWW   Вверх
Wowa
Дата 18.11.2005, 05:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

Репутация: нет
Всего: 290



А вот вариант на Яве. Передаем аргументами два числа (a и b) и функция возвращает в случайном порядке все числа, где:
a<=x>=b
x - натуральное число


Код

public class zahlen {
static int interval;

    public static void main(String[] args) {
        int a=1;
        int b=10;
        b++;b++;
        int[] zufallzahlen_array;
        zufallzahlen_array=zufallzahlen(a,b);
        for(int i=1;i<(b-a);i++)
         {
            System.out.print(zufallzahlen_array[i]+" ");
         }
    }
    
    public static int[] zufallzahlen(int a, int b) {
        interval=b-a;
        int[] pool = new int[interval];
        int[] zufallzahlen_array = new int[interval];
        // Initialisierung
            for (int i=0; i<interval;i++) pool[i]=i;
            interval--;                        
             for(;interval>0;interval--)
             {
                 int ind=(int)(Math.random()*interval); //случайный индекс массива
                 zufallzahlen_array[interval] = a+pool[ind];
//                 System.out.println(a+pool[ind]+" ");
                     pool[ind]=pool[interval-1]; //последнее число на место "изъятого"
             }
             return zufallzahlen_array; 
    }
}


PM WWW   Вверх
cardinal
Дата 26.11.2005, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 5
Всего: 99



Цитата(Denis @ 26.11.2005, 16:53)
А дробные?

Цитата(Wowa @ 13.11.2005, 14:54)
Числа - целые.

Denis-delphist, хватит флеймить!


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
eskaflone
Дата 26.11.2005, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 5.11.2005

Репутация: нет
Всего: 3



Код

int ind=(int)(Math.random()*interval); //случайный индекс массива    
                 zufallzahlen_array[interval] = a+pool[ind];


значения math.Random будут повторятся ,и условие
Цитата
Числа не должны повторятся.
не выполнится.
PM MAIL   Вверх
sergejzr
Дата 26.11.2005, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 4
Всего: 360



eskaflone, читай внимательно весь топик. Возможно несколько раз...


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Mayk
Дата 26.11.2005, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 2
Всего: 134



[прочитал кажется всё и не по диагонали даже]
sergej.z
можно записать короче
Код

 int * pool = new int[interval]; 
 for(int i=0;i<interval;i++)
    pool[i]=min+i; //инициализация
 random_shuffle(pool, pool+interval);

smile

Это сообщение отредактировал(а) Mayk - 26.11.2005, 22:19


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
sergejzr
Дата 26.11.2005, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 4
Всего: 360



Mayk из того, что перемешивание закрыли в функцию, не следует, что там нет переборки массива. smile
Из того, что ктото подумал над решением задачи, не следует, что не обязательно подумать ещё раз.

А в общем + за нахождение функции. Это STL, как я понимаю? Я с ним не очень много работал и в последний раз 4 года назад smile
Добавлено @ 22:34
Кстати это помоему не намного длиннее. Если учесть, что это полная программа.
Код

#include "iostream.h"
int main()
{
    
 int min=90;
 int max=100;
 int interval=max-min;
 int * pool = new int[interval];
 
 for(int i=0;i<interval;pool[i]=i,i++);

 for(interval--;interval>0;interval--)
 {
   int ind=(rand()*time(0))%interval;
   cout<<min+pool[ind]<<" "<<endl;
   pool[ind]=pool[interval-1];    
 }
  return 0;
}



--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Mayk
Дата 26.11.2005, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 2
Всего: 134



Цитата(sergej @ 27.11.2005, 02:28)
Mayk из того, что перемешивание закрыли в функцию, не следует, что там нет переборки массива.

Она там есть. Только там делается наоборот:
Там i-ый элемент(i пробегает от begin до end) swap'ается со случайным,
а не случайный с j-ым (j пробегает от end до begin). smile

Цитата(sergej @ 27.11.2005, 02:28)
Это STL, как я понимаю?

Угу

Цитата(sergej @ 27.11.2005, 02:28)
Из того, что ктото подумал над решением задачи, не следует, что не обязательно подумать ещё раз.

Просто когда знаешь решение, думать уже не хочется smile
Подобная тема, кстати, была когда-то в c++.
-- добавлю в ручную чтоб тему не апать --
Цитата(sergej @ 27.11.2005, 02:28)
Если учесть, что это полная программа.

Ну я бы вообще так делал
Код

#include <algorithm>
#include <iostream>
#include <iterator>
using namespace std;
int main(){
 int min=90,max=100,interval=max-min;
 int * pool = new int[interval];
 for(int i=0;i<interval;pool[i]=min+i++);
 random_shuffle(pool, pool+interval);
 copy(pool,pool+interval, ostream_iterator<int>(cout, endl));
 delete[] pool;
}

Таким образом код сокращаем до 4 строк (от new и до delete если считать без delete'а), вместо 6. 33% строк выкинули благодаря стандартной либе smile

Это сообщение отредактировал(а) Mayk - 26.11.2005, 23:04


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Denis-delphist
Дата 27.11.2005, 09:28 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











cardinal
Я просто сделал задачю интереснее. Разве тебе не интерестно, как профессионалу решить задачу потруднее???
  Вверх
GIK
Дата 27.11.2005, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый человек
**


Профиль
Группа: Участник
Сообщений: 985
Регистрация: 3.6.2005
Где: я только не небыв ал

Репутация: нет
Всего: 14



А если просто создать массив из чисел [min++] длинной в разницу.
Код

var mas = new Array();
var min=100;
var max=200;
var r=max-min;
 for (var i=0; i<r; i++)
{ mas [i]=min++; //инкремент с минимума и присвоение итога еллементу массива
 } 

Или я не понял вопроса про генерацию числа???
А может тема довно закрыта smile

Добавлено @ 11:43
Ой, я кажется не вовремя и не с тем примером smile


--------------------
Математика=>пиво=> програмирование, три вещи последовательны и совместимы !!!
Программирование - это не деятельнось! Программирование - это состояние души!
Бог - самый крутой программист.
PM MAIL ICQ   Вверх
eskaflone
Дата 27.11.2005, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 5.11.2005

Репутация: нет
Всего: 3



sergej.z

в посте wowa не заметил одной строчки :
Код

                     pool[ind]=pool[interval-1]; //последнее число на место "изъятого"

теперь все понятно.
PM MAIL   Вверх
sergejzr
Дата 27.11.2005, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 4
Всего: 360



Mayk, ГЫ smile
Разница там небольшая! вот например то же в 12 строк smile)))

Код

#include "iostream.h"
int main(){ 
 int min=90,100,interval=max-min;
 int * pool = new int[interval]; 
 for(int i=0;i<interval;pool[i]=i,i++);
 for(interval--;interval>0;interval--){
   int ind=(rand()*time(0))%interval;
   cout<<min+pool[ind]<<" "<<endl;
   pool[ind]=pool[interval-1];    
 }
 delete [] pool;
}

Вообще можно извратится ещё короче, но ИМХО уже лишнее.

Есть несколько нюансов на которые я ориентируюсь при ответе.
  1. любую программу можно написать в две строки
    Код

    #include "myLib.h"
    execMyProgramm(myArguments); 

    Из за этого она оптически короче, но на деле возможно тормознутее и запутаннее. То есть сравнивать длинну кода таким образом нельзя. Ещё любую программу можно записать в одну строку.
  2. Не всегда стоит подключать библиотеки. Маленькие задачи часто лучше решать вручную, заодно тренировка. Другое дело, если они уже подключены.
  3. Алгоритмы можно использовать в разных языках программирования, в то время как код - нет..
  4. Если задают такое задание, то в основном не для того, чтобы проверить, насколько хорошо человек знает различные либы



--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Dov
Дата 4.12.2005, 00:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: нет
Всего: 88



Цитата(sergej @ 26.11.2005, 22:28)
#include "iostream.h"
int main()
{
   
int min=90;
int max=100;
int interval=max-min;
int * pool = new int[interval];
 
for(int i=0;i<interval;pool[i]=i,i++);
for(interval--;interval>0;interval--)
{
  int ind=(rand()*time(0))%interval;
  cout<<min+pool[ind]<<" "<<endl;
  pool[ind]=pool[interval-1];   
}
  return 0;
}
Имхо, классный алгоритм. Пару лет назад мне понадобилась такая штука, но кроме перебора всего массива я ничего не придумал.
sergej.z, молодец. smile


--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0923 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.