![]() |
|
|
![]()
|
|
| Wowa |
|
|||
|
Эксперт Профиль Группа: Админ Сообщений: 15017 Регистрация: 14.9.2000 Где: Винград Репутация: нет Всего: 290 |
Есть два числа. Нужно найти все числа между ними, но случайным образом! Т.е. через Math.random.
Числа не должны повторятся. И при генерировании нового случайного числа, не допускается переборка всего массива с целью проверки было ли это число уже найдено или нет. Давайте подумаем над этим алгоритмом. У меня есть такие идеи: нужно найти разницу между числами А и Б. Создать массив этой длины. И просто потом генерировать числа и записывая их в нужные ячейки массива. |
|||
|
||||
| cardinal |
|
|||
![]() Инженер ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6003 Регистрация: 26.3.2002 Где: Германия Репутация: 5 Всего: 99 |
То есть числа целые как я понял (1, 2, 3 и т.д.)?
Тогда надо как бы умножать то, что возвращает Math.random, то есть надо знать диапазон чисел. И так вопрос -------------------- Немецкая оппозиция потребовала упростить натурализацию иммигрантов В моем блоге: Разные истории из жизни в Германии "Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие |
|||
|
||||
| hiHo |
|
|||
|
Unregistered |
Попробуй так Пример у тебя числа с М1 по М2 1) Копируешь все по порядку в массив (длинна массива М2-М1+1) . 2) Берешь случайный на его место ставишь последний количество уменьшаешь на 1. 3) и тд пока массив не станит пустым. |
|||
|
||||
| Wowa |
|
||||
|
Эксперт Профиль Группа: Админ Сообщений: 15017 Регистрация: 14.9.2000 Где: Винград Репутация: нет Всего: 290 |
да, как угодно могут идти. Как задать, так и будут идти. Числа - целые. Добавлено @ 16:55
На что умножать? |
||||
|
|||||
| sergejzr |
|
|||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 4 Всего: 360 |
насчёт массива - правильно. В нём отмечать числа, которые уже найдены. Только вот придётся имхо сегменты вводить. то есть первое найденное число разобьёт диапазон на 2 сегмента, второе на 3 или останется 2. Если исключим 0, то ксор границ даст 0 , если диапазон заполнен полностью. Короче мудрённый алгоритм получится. Не знаю, стоит ли овчинка выделки.
А вот простой алгоритм ты описал вроде. грубо говоря:
конечно под конец находить будет долго, но это самое простое решение. Игаче надо думать про сегменты.. |
|||
|
||||
| Wowa |
|
|||
|
Эксперт Профиль Группа: Админ Сообщений: 15017 Регистрация: 14.9.2000 Где: Винград Репутация: нет Всего: 290 |
ну, сегменты не самое страшное. Но у меня нет мыслей, как их тут использовать. |
|||
|
||||
| Akina |
|
||||||||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 20 Всего: 454 |
создаем двумерный массив
-------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
||||||||
|
|||||||||
| cardinal |
|
||||
![]() Инженер ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6003 Регистрация: 26.3.2002 Где: Германия Репутация: 5 Всего: 99 |
Akina, а ты предлагаешь не искать их случайным образом, а расбросать случайным образом. Но вообще очень хитро! Если Wow'у устроит разбрасывание чисел, то почему бы и нет... Добавлено @ 20:16
Ну на 10, на 100... Просто привык, что Random возвращает числа в интевале 0..1. -------------------- Немецкая оппозиция потребовала упростить натурализацию иммигрантов В моем блоге: Разные истории из жизни в Германии "Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие |
||||
|
|||||
| Rick |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 122 Регистрация: 4.11.2005 Где: Новосибирск Репутация: нет Всего: 3 |
идеально подходят множества, но всего от 0 до 255
--------------------
Не бывает атеистов в окопах под огнем |
|||
|
||||
| Graf Zeppelin |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 130 Регистрация: 28.3.2004 Репутация: нет Всего: 1 |
А может через генерацию списка и выбора с удалением?
--------------------
Jah, help me! |
|||
|
||||
| Wowa |
|
|||
|
Эксперт Профиль Группа: Админ Сообщений: 15017 Регистрация: 14.9.2000 Где: Винград Репутация: нет Всего: 290 |
а подробннее? Как удаление делать будешь, если не допускается перебор всего массива. |
|||
|
||||
| Akina |
|
||||||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 20 Всего: 454 |
ясен пень... просто условия
И вообще в контексте задачи я не понимаю термина "найти"... вывести все, но в случайном порядке? мой алгоритм это делает... что-то другое? объясните что именно, у меня фантазии не хватает. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
||||||
|
|||||||
| Wowa |
|
|||
|
Эксперт Профиль Группа: Админ Сообщений: 15017 Регистрация: 14.9.2000 Где: Винград Репутация: нет Всего: 290 |
почему противоречат? |
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 20 Всего: 454 |
Почему? потому что очередное сгенерированное СЛУЧАЙНО число из заданного диапазона имеет право быть найденным ранее. А проверить так это или нет можно только сравнением с ранее найденными, т.е. сканирование найденных. Противоречие. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| Wowa |
|
||||
|
Эксперт Профиль Группа: Админ Сообщений: 15017 Регистрация: 14.9.2000 Где: Винград Репутация: нет Всего: 290 |
противоречия нет. Если первое число 100, а второе 200. То создаем массив на 100 элементов. Обнуляем его. И если какое-то число найдено, то пишем его в массив по индексу этого самого числа, если же array[random]!=0 Где тут противоречие?
Или же второй вариант - поиграть с знаками больше, меньше при нахождении чисел... |
||||
|
|||||
| neutrino |
|
|||
![]() Gothic soul ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 3041 Регистрация: 25.3.2002 Где: Верхняя Галилея, Кармиэль Репутация: нет Всего: 62 |
Привет!
Может Г.А??? Операция кросовера как раз разнообразит геном... А отбирать надо наиболее разнообразные. Но это только для сравнительно больших диапазонов чисел. -------------------- The truth comes from within ... Покойся с миром, Vit |
|||
|
||||
| sergejzr |
|
|||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 4 Всего: 360 |
Akina, я немного не понял твоей идеи, поэтому возможно продублирую..
Вроде получилось оптимально и без ужасов Идея: есть "мешок" с числами достаём оттуда в случайном порядке, но не кладём числа обратно в мешок. Алгоритм: массив из n чисел (n = max - min) в случайном порядке находится не число, а индекс в этом массиве от 0 - n. Искомое число - число по этому индексу. Забрали число, на его место ставим последнее, массив таким образом сокращается на один элемент.
Акина, разобрался с твоим алгом. Но если Array(0,i) = Random Несколько раз даст один и тот же результат? |
|||
|
||||
| Wowa |
|
|||
|
Эксперт Профиль Группа: Админ Сообщений: 15017 Регистрация: 14.9.2000 Где: Винград Репутация: нет Всего: 290 |
есть еще одно условие: "Числа не должны повторяться".
Добавлено @ 01:14 sergej.z а чем к примеру, твой алгоритм лучше моего? Добавлено @ 01:16 Насколько я понял, твой вариант быстрее, т.к. нет вероятности того, что "выпадет" тоже самое число. |
|||
|
||||
| sergejzr |
|
|||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 4 Всего: 360 |
Мой алгоритм линеарный. Без циклов совсем. O(n). Самое сложное действие - % на 32 такта
ИМХО - оптимальное решение. Гы
|
|||
|
||||
| sergejzr |
|
|||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 4 Всего: 360 |
Гы
|
|||
|
||||
| Akina |
|
||||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 20 Всего: 454 |
Гы... Начинающий программист: Я тут написАл программу, но она не работает, где ошибка? Опытный программист: В генах...
при этом числа действительно будут в случайном порядке, но, увы, рандом будет неравномерным... вероятность последних чисел быть "первее" в выборке будет выше, чем первых... надо сдвигать, а не переносить последнее. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
||||
|
|||||
| Wowa |
|
|||
|
Эксперт Профиль Группа: Админ Сообщений: 15017 Регистрация: 14.9.2000 Где: Винград Репутация: нет Всего: 290 |
сдвигать - это уже совсем другая работа.. |
|||
|
||||
| sergejzr |
|
|||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 4 Всего: 360 |
Вероятность остаётся той же самой. ведь случайный индекс 0 - величина_мешка. От того, где какое число стоит, ничего практически не зависит. Попробуй прогони програму 10 000 раз, никакой зависимости от сдвига не заметишь. Даже наоборот, числа дополнительно "перемешиваются" |
|||
|
||||
| nworm |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 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 |
|||
|
||||
| Wowa |
|
|||
|
Эксперт Профиль Группа: Админ Сообщений: 15017 Регистрация: 14.9.2000 Где: Винград Репутация: нет Всего: 290 |
А вот вариант на Яве. Передаем аргументами два числа (a и b) и функция возвращает в случайном порядке все числа, где:
a<=x>=b x - натуральное число
|
|||
|
||||
| cardinal |
|
||||
![]() Инженер ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6003 Регистрация: 26.3.2002 Где: Германия Репутация: 5 Всего: 99 |
Denis-delphist, хватит флеймить! -------------------- Немецкая оппозиция потребовала упростить натурализацию иммигрантов В моем блоге: Разные истории из жизни в Германии "Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие |
||||
|
|||||
| eskaflone |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 75 Регистрация: 5.11.2005 Репутация: нет Всего: 3 |
значения math.Random будут повторятся ,и условие
|
||||
|
|||||
| sergejzr |
|
|||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 4 Всего: 360 |
eskaflone, читай внимательно весь топик. Возможно несколько раз...
|
|||
|
||||
| Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 2 Всего: 134 |
[прочитал кажется всё и не по диагонали даже]
sergej.z можно записать короче
Это сообщение отредактировал(а) Mayk - 26.11.2005, 22:19 -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
| sergejzr |
|
|||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 4 Всего: 360 |
Mayk из того, что перемешивание закрыли в функцию, не следует, что там нет переборки массива.
Из того, что ктото подумал над решением задачи, не следует, что не обязательно подумать ещё раз. А в общем + за нахождение функции. Это STL, как я понимаю? Я с ним не очень много работал и в последний раз 4 года назад Добавлено @ 22:34 Кстати это помоему не намного длиннее. Если учесть, что это полная программа.
|
|||
|
||||
| Mayk |
|
||||||||||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 2 Всего: 134 |
Она там есть. Только там делается наоборот: Там i-ый элемент(i пробегает от begin до end) swap'ается со случайным, а не случайный с j-ым (j пробегает от end до begin).
Угу
Просто когда знаешь решение, думать уже не хочется Подобная тема, кстати, была когда-то в c++. -- добавлю в ручную чтоб тему не апать --
Ну я бы вообще так делал
Таким образом код сокращаем до 4 строк (от new и до delete если считать без delete'а), вместо 6. 33% строк выкинули благодаря стандартной либе Это сообщение отредактировал(а) Mayk - 26.11.2005, 23:04 -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
||||||||||
|
|||||||||||
| Denis-delphist |
|
|||
|
Unregistered |
cardinal
Я просто сделал задачю интереснее. Разве тебе не интерестно, как профессионалу решить задачу потруднее??? |
|||
|
||||
| GIK |
|
|||
![]() Добрый человек ![]() ![]() Профиль Группа: Участник Сообщений: 985 Регистрация: 3.6.2005 Где: я только не небыв ал Репутация: нет Всего: 14 |
А если просто создать массив из чисел [min++] длинной в разницу.
Или я не понял вопроса про генерацию числа??? А может тема довно закрыта Добавлено @ 11:43 Ой, я кажется не вовремя и не с тем примером -------------------- Математика=>пиво=> програмирование, три вещи последовательны и совместимы !!! Программирование - это не деятельнось! Программирование - это состояние души! Бог - самый крутой программист. |
|||
|
||||
| eskaflone |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 75 Регистрация: 5.11.2005 Репутация: нет Всего: 3 |
sergej.z
в посте wowa не заметил одной строчки :
теперь все понятно. |
|||
|
||||
| sergejzr |
|
||||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 4 Всего: 360 |
Mayk, ГЫ
Разница там небольшая! вот например то же в 12 строк
Вообще можно извратится ещё короче, но ИМХО уже лишнее. Есть несколько нюансов на которые я ориентируюсь при ответе.
|
||||
|
|||||
| Dov |
|
|||
![]() аСинизатор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1721 Регистрация: 10.5.2003 Где: Эрец-Исраэль Репутация: нет Всего: 88 |
sergej.z, молодец. -------------------- Тут вечности запах томительный, И свежие фрукты дешевые, А климат у нас – изумительный, И только соседи – #уевые. Игорь Губерман. |
|||
|
||||
![]()
|
| Правила форума "Алгоритмы" | |
|
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Алгоритмы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |