Добро пожаловать к нам в гости! Наш сайт посвящён программе NeoBook, с помощью которой вы легко сможете создавать собственные мультимедиа-приложения без необходимости изучать сложные языки программирования! Зарегистрируйтесь, чтобы стать членом нашего сообщества.
Нужна помощь! Голову "сломал" решая эту задачку...
Необходимо сгенерировать массив случайных чисел, чтобы ни одно число в этом массиве не повторялось. Сгенерировать массив чисел не сложно, например:
Code
Loop "1" "[количество генерируемых чисел]" "[текущее число]" :Randomaze Random "[общее число генерируемых чисел]" "[сгенерированное число]" If "[сгенерированное число]" ">" "0" SetVar "[Num[текущее число]]" "[сгенерированное число]" Else GotoLine "Randomaze" EndIf EndLoop
Таким образом мы сгенерируем массив "Num". Однако, одно дело, если мы генерируем 5 случайных чисел из 100, а другое - 5 из 15. Одно или два числа точно будут повторяться. Хотя и в первом случае (5 из 100) повторение чисел не избежать.
Один из возможных выходов я вижу в создании сценария, позволяющего находить повторяющиеся числа и заменять их на вновь сгенерированные. Например:
Code
Loop "1" "[количество генерируемых чисел]" "[текущее число]" SetVar "[число следующее после текущего]" "[текущее число]+1" Loop "1" "[текущее число]" "[новое текущее число]" If "[Num[число следующее после текущего]]" "=" "[Num[новое текущее число]]" Random "[общее количество генерируемых чисел]" "[сгенерированное число]" SetVar "[Num[число следующее после текущего]]" "[сгенерированное число]" EndIf EndLoop EndLoop
Этот пример задачу не решает, но направление думаю верное... кто, что посоветует?
Обычно, период повторяемости чисел, в генераторах случайных чисел, довольно большой, он зависит от конкретного алгоритма, от 130000 до 2 в хрен знает какой степени. Для прикладных целей этого вполне предостаточно. Может у тебя не верный подход к генерации чисел. Random "[возмжно тут у тебя неправильное число]" "[сгенерированное число]"
- А вам какую операционку поставить - экспи, семерку или висту? - Это ты сейчас о чем? - Олег Георгиевич, вам какой компьютер хотелось бы - молодежный или надежный? - Ну, конечно, надежный! - Вот, значит - экспи, без вопросов! Сейчас сделаем...
(Улицы разбитых фонарей, сезон 10, серия 17)
Единственная инновация Windows 8 это - Metro, чтобы дебилы по иконкам не промахивались!
При модном втюхе модоподдающимся начинает нравиться
Спасибо! Наверное никогда бы не додумался использовать для этого ListBox... Гениальное решение! Теперь создать массив из случайных чисел не составит труда.
Реализация на основе перемешивания индексов массива чисел заданного диапазона. Требование уникальности чисел при этом соблюдается само собой и не требует специальной обработки в алгоритме.
Call "RndRange" "[LB]" "[UB]" "[Cnt]"
[LB] - нижний предел диапазона чисел [UB] - верхний предел диапазона чисел [Cnt] - количество символов, которое нужно получить (обьем конечного массива).
На выходе получаем массив [RndRange[i]] содержащий перемешанные числа из диапазона.
Пример: Call "rndrange" "1" "20" "20"
Числа нижнего и верхнего предела включаются в диапазон, результирующее количество символов не может быть больше чем ширина диапазона (для соблюдения уникальности чисел).
Вообще, наверное можно и на нб реализовать, но мне не удалось понять как реализовать в нб одну команду в трюке с массивом... Работает быстрее чем списки, особенно для больших обьемов чисел.
Добавлено (02 Апрель 2011, 06:38) --------------------------------------------- Кстати подобные алгоритмы генерации случайных чисел, перемешивания можно много где применить. Например часто используется в разных логических играх.
Вообще, наверное можно и на нб реализовать, но мне не удалось понять как реализовать в нб одну команду в трюке с массивом...
Может быть и можно, но зачем заморачиваться с массивом, когда есть ListBox, и есть готовое и простое решение?
Что касаемо "скорости", то конечно необушный ListBox медленная штука, но на малых массивах это - мелочь. - А вам какую операционку поставить - экспи, семерку или висту? - Это ты сейчас о чем? - Олег Георгиевич, вам какой компьютер хотелось бы - молодежный или надежный? - Ну, конечно, надежный! - Вот, значит - экспи, без вопросов! Сейчас сделаем...
(Улицы разбитых фонарей, сезон 10, серия 17)
Единственная инновация Windows 8 это - Metro, чтобы дебилы по иконкам не промахивались!
При модном втюхе модоподдающимся начинает нравиться
dim question_array(29) dim i1, i2, x, kolvopr kolvopr = 30 i1 = 1 Randomize question_array(0) = Int(1 + (Rnd() * kolvopr)) do while i1<30 x = Int(1 + (Rnd() * kolvopr)) i2 = 0 do while i2<i1 if x = question_array(i2) then x = Int(1 + (Rnd() * kolvopr)) i2=0 else i2 = i2+1 end if Loop question_array(i1) = x i1 = i1+1 Loop
вывод массива
for each index in question_array list = list & index & vbCrLf next MsgBox list
Сообщение отредактировано DEMBEL - Пн, 01 Декабря 2014, 18:08
Я вот тут делал функцию, может кто посоветует, что надо изменить, чтоб с её помощью можно было б получать тот же результат, что и у функции Дембеля? Очень надо!!
Опять чего-то мудрят, ведь есть же решение через необушный ListBox, хоть и не в виде самостоятельной функции (и несколько громоздко из-за ListBox), но совершенно нормально работает.
Добавлено (01 Декабря 2014, 19:58) ---------------------------------------------
Цитатаmishem ()
По этому я категорически против всяких скриптов и никогда не использую их. :(
Если же нужно просто получить случайное число в пределах диапазона (не беспокоясь о повторе), то и на NB это можно сделать элементарно. Где-то я уж приводил пример подобной функции - просто сдвигаем результат необушной Random на нужную величину от 0. Причем, диапазон может быть как среди положительных значений, так и отрицательных, и даже смешанных. - А вам какую операционку поставить - экспи, семерку или висту? - Это ты сейчас о чем? - Олег Георгиевич, вам какой компьютер хотелось бы - молодежный или надежный? - Ну, конечно, надежный! - Вот, значит - экспи, без вопросов! Сейчас сделаем...
(Улицы разбитых фонарей, сезон 10, серия 17)
Единственная инновация Windows 8 это - Metro, чтобы дебилы по иконкам не промахивались!
При модном втюхе модоподдающимся начинает нравиться
Опять чего-то мудрят, ведь есть же решение через необушный ListBox, хоть и не в виде самостоятельной функции (и несколько громоздко из-за ListBox), но совершенно нормально работает.
просто у меня уже на многих страницах через функцию дембеля сделано и везде переделывать много времени, а так функцию заменил и все А с литбоксом я не делал потому что не понял как этот метод не копируя каждый раз лист бокс применять на разных страницах Петер, если покажешь, как буду благодарен, потому что через лист бокс быстрее, чем через мою функцию получаются данные, но мне приходилось каждый раз копировать лист бок и менять формулу. И мне надо получать числа именно не повторяясь, если б надо было просто случайные числа, то и стандартная функция подходит, главное прибавить или отнять от неё нужное число, чтоб интервал изменить Вик
Сообщение отредактировано wiksl - Пн, 01 Декабря 2014, 20:03
как этот метод не копируя каждый раз лист бокс применять на разных страницах
Не надо копировать ListBox, можно все делать через один и тот же объект, т.к. к нему можно обратиться с любой страницы, а полученные результаты, если их несколько и все нужны, хранить в массивах. ListBox нужен только для поиска повторов.
Добавлено (01 Декабря 2014, 20:14) ---------------------------------------------
Цитатаwiksl ()
Петер, если покажешь,
Попробую, но только часика через два, и мне нужно четко понимать что требуется. - А вам какую операционку поставить - экспи, семерку или висту? - Это ты сейчас о чем? - Олег Георгиевич, вам какой компьютер хотелось бы - молодежный или надежный? - Ну, конечно, надежный! - Вот, значит - экспи, без вопросов! Сейчас сделаем...
(Улицы разбитых фонарей, сезон 10, серия 17)
Единственная инновация Windows 8 это - Metro, чтобы дебилы по иконкам не промахивались!
При модном втюхе модоподдающимся начинает нравиться
Попробую, но только часика через два, и мне нужно четко понимать что требуется.
надо задавать в переменной начальное, конечное число интервала чисел, и количество чисел и получать в массиве эти числа в случайном порядке, каждый раз в другом т.е задаю nac=1 //начало kon=5 // конец col=5 //кол-во чисел получаю аа1=2 аа2=1 аа3=4 аа4=5 аа5=3 или другой случайный набор чисел. Так вроде получислось, если без функции, а ведь раньше, когда пробовал не работало, теперь остался один вопрос: а метод через ЛистБох можно через функцию сделать? и если да, то как? Вик
Сообщение отредактировано wiksl - Пн, 01 Декабря 2014, 20:37
Переписать-то можно, но работать будет на порядок медленнее, из-за ручного ресайза массива с перебором элементов в лишнем цикле, и чем больше массив тем медленнее. Тогда уж вынимание из ListBox быстрее будет. Я то делал чтобы быстрее было.
Вот как это может выглядеть в виде необушной функции (см.прикрепление) Объект ListBox "в работе" остался, но перекочевал в функцию, результат можно брать как из ListBox, так и из массива (см.дэмку и отладчик) В самом начале функции имеются всякие разные IF для проверки входных параметров (сделано прямолинейно и не полностью) - предлагается к самостоятельной доработке по необходимости. Функция может работать как с положительными значениями, так и с отрицательными.
Впрочем, никто не мешает и функцию доработать, если потребуется (там не все экономично - можно сделать чуть иначе, если результат помещать только в массив).
- А вам какую операционку поставить - экспи, семерку или висту? - Это ты сейчас о чем? - Олег Георгиевич, вам какой компьютер хотелось бы - молодежный или надежный? - Ну, конечно, надежный! - Вот, значит - экспи, без вопросов! Сейчас сделаем...
(Улицы разбитых фонарей, сезон 10, серия 17)
Единственная инновация Windows 8 это - Metro, чтобы дебилы по иконкам не промахивались!
При модном втюхе модоподдающимся начинает нравиться