|
0 / 0 / 0
Регистрация: 27.02.2012
Сообщений: 21
|
|
Помогите с алгоритмом Rnd27.02.2012, 03:35. Показов 3770. Ответов 24
Метки нет (Все метки)
Прошу помочь в таком вопросе. На форме 32 кнопки с рисунками, 8 столбцов и 4 строки.
При каждом нажатии на кнопку "Старт" все 32 кнопки должны выстроиться в случайном порядке. Применяю i = Int(32*Rnd) для каждой кнопки. Они и перемешиваются, и выстраиваются, как положено. НО! Появляется только от 18 до 24 кнопок при каждом нажатии на "Старт". Остальные почему-то оказываются под другими кнопками (по 1 - 3 штуки под кнопкой). Если каждой кнопке присваиваю i = 0, i = 1... i = 31, они дружно строятся по порядку. Подскажите, пожалуйста, новичку, в чем проблема?
0
|
|
| 27.02.2012, 03:35 | |
|
Ответы с готовыми решениями:
24
Шифрование алгоритмом моноалфавитной подстановки и Алгоритмом Цезаря Помогите с алгоритмом Помогите с алгоритмом! |
|
0 / 0 / 0
Регистрация: 04.03.2008
Сообщений: 250
|
|
| 27.02.2012, 11:11 | |
|
Мне кажется, в алгоритм нужно добавить проверку на то, что бы i не повторялся, а так, по теории вероятности, это вполне возможно для 32 итераций.
0
|
|
|
0 / 0 / 0
Регистрация: 25.04.2011
Сообщений: 44
|
|
| 27.02.2012, 12:30 | |
|
[italic]Результат[/italic] =Int(([italic]верхняяГраница [/italic] - [italic]нижняяГраница[/italic] + 1) * Rnd + [italic]нижняяГраница[/italic] )
Здесь [italic]верхняяГраница [/italic] представляет максимальное число в диапазоне, а [italic]нижняяГраница [/italic] минимальное число в диапазоне.
0
|
|
|
2 / 2 / 1
Регистрация: 18.10.2007
Сообщений: 1,748
|
|
| 27.02.2012, 13:01 | |
|
Алгоритм в студию.
Кстати, еще полезно будет использование оператора Randomize, иначе "случайные" числа всегда будут начинаться с одного "случайного" числа.
0
|
|
|
0 / 0 / 0
Регистрация: 27.02.2012
Сообщений: 21
|
|
| 28.02.2012, 02:06 [ТС] | |
|
Спасибо всем, кто откликнулся на мой зов о помощи!
Randomize я применил. Все делал, как вы и говорите. Единственно, мысль у меня была, как проверить, чтобы i не повторялась (а она, переменная, случайное число из 32, обязательно повторяется несколько раз!). Что и отметил здесь в своем послании первый автор. Так вот. Как проверить это, нигде не смог отыскать в Интернете. Искал и в Гугле, и в Яндексе. Подскажите, пожалуйста, как сделать, чтобы при проходе от 0 до 31 случайные числа не повторялись. То есть, чтобы шли в любой последовательности от 0 до 31, но без повторений!
0
|
|
|
0 / 0 / 0
Регистрация: 04.03.2008
Сообщений: 250
|
|
| 28.02.2012, 11:02 | |
|
Да просто тупо собирать результаты применения генератора случайных чисел в какой-нибудь массив из 32 элементов, и каждый раз сравнивать, нет ли полученного числа в массиве. Если есть, отбрасывать, и снова пробовать. Когда массив заполнится, применить его к кнопкам. Это первое, что приходит в голову, может, не слишком эффективно, но работать будет.
0
|
|
|
0 / 0 / 0
Регистрация: 04.03.2008
Сообщений: 250
|
|
| 28.02.2012, 11:08 | |
|
Вдогонку. И присмотрись к формуле, озвученной SapSZerO - она отбросит ненужные числа, ограничив диапазон выдаваемых значений. В целом, алгоритм предлагаю такой - объявляем массив, динамический, без размерности, и начинаем его заполнять. Генерируется число, проверка, нет ли его в массиве. Есть - генерируем снова, нет - записываем в массив. Почитай в MSDN про Redim, обязательно с Preserve. И так в цикле, до победного конца . Победный конец наступит, когда UBound массива покажет 32.
0
|
|
|
0 / 0 / 0
Регистрация: 13.02.2012
Сообщений: 10
|
|
| 28.02.2012, 18:36 | |
|
делаешь массив чисел от 1 до 32, массив заполняешь числами от 1 до 32 соответственно а(1)=1 ... а(32)=32
делаешь функцию для перетрушивания массива, что-то типа этого: Sub ArrayRand(ByRef mas, n, m)'массив, эл. в мас., сколько раз трухнуть For i = 1 To m n1 = Int(Rnd * n) + 1 n2 = Int(Rnd * n) + 1 temp1 = mas(n1) mas(n1) = mas(n2) mas(n2) = temp1 Next i End Sub вызываешь функцию и у тебя массив с неповторяющимися числами в случайном порядке. вызываешь ее
0
|
|
|
0 / 0 / 0
Регистрация: 27.02.2012
Сообщений: 21
|
|
| 29.02.2012, 03:17 [ТС] | |
|
Спасибо, ребята! Все получилось классно! И начинаются по-разному случайные числа, и по очереди идут разные, и не повторяются. Ну в смысле, сделал так, что не повторяются! Еще раз пасиб, как тут говорят.
0
|
|
|
Irokez
|
||||||
| 05.03.2012, 12:24 | ||||||
|
в догонку: как делал я.
тоже объявлял масив на 32 элемента, но не заполнял. при каждом рнд делал
|
||||||
|
0 / 0 / 0
Регистрация: 27.02.2012
Сообщений: 21
|
|
| 06.03.2012, 02:08 [ТС] | |
|
Я тоже так примерно сделал. Единственным недостатком этого кода, как мне кажется, является именно то (о чем Вы и отметили), что приходится повторять его для каждого элемента массива. Думаю, есть какое-то более простое решение. Наверняка есть! Но пока не доходит.
Кстати, я делал и так (что уже проще, по-моему): i = 0 i = i + 1 If i > 32 Then i = i - 32 Но все-таки и опять-таки для каждого элемента! Затем в произвольном порядке "перепутал" все кнопочки и получилось просто отлично!
0
|
|
|
1 / 1 / 0
Регистрация: 22.04.2011
Сообщений: 47
|
||||||
| 13.03.2012, 00:02 | ||||||
|
Обобщая и исправляя все вышеописанное:
0
|
||||||
|
6 / 6 / 3
Регистрация: 17.10.2007
Сообщений: 1,119
|
|
| 13.03.2012, 01:55 | |
|
Esli est' dostup k ORACLE, to etot select naprimer vidaet 6 sluchajnyx chisel v diapazone ot 1 do 49.
select r from (select r from (select rownum r from all_objects where rownum < 50) order by dbms_random.value) where rownum <=6
0
|
|
|
2 / 2 / 1
Регистрация: 18.10.2007
Сообщений: 1,748
|
|
| 13.03.2012, 02:26 | |
|
2VladConn: при всем уважении, на мой взгляд совсем нецелесообразно получать случайные числа через БД сервер, если задача расстановки случайных величин никак с базой не связана.
0
|
|
|
6 / 6 / 3
Регистрация: 17.10.2007
Сообщений: 1,119
|
|
| 13.03.2012, 03:49 | |
|
Alexey Spirin,
Да, конечно. Показано ради красоты как таковой. VladConn
0
|
|
|
6 / 6 / 3
Регистрация: 17.10.2007
Сообщений: 1,119
|
|
| 13.03.2012, 04:10 | |
|
Alexey Spirin,
Кстати, если надо, скажем, 160,000 разных без повтора случайных упорядоченных чисел в некотором дапазоне, то будет рационален цикл у клиента или один такой селект на сервере? Я бы хотел проверить, но сейчас у меня нет Оракла. VladConn
0
|
|
|
2 / 2 / 1
Регистрация: 18.10.2007
Сообщений: 1,748
|
|
| 13.03.2012, 15:18 | |
|
Смотря для чего и какие алгоритмы использовать.
Если это разовая операция - то, конечно же, лучше на сервере. Но если каждый из, к примеру, тысячи пользоватлей будет ее периодически вызывать, то это придется делать на клиенте, чтобы лишний раз не перегружать сервер. На сервере это скорее всего выдет быстрее, потому как там исопльзуются наиболее быстрые алгоритмы.
0
|
|
|
6 / 6 / 3
Регистрация: 17.10.2007
Сообщений: 1,119
|
|
| 13.03.2012, 16:59 | |
|
И сервер может быть помощнее.
0
|
|
|
0 / 0 / 0
Регистрация: 27.02.2012
Сообщений: 21
|
|
| 24.03.2012, 02:57 [ТС] | |
|
Спасибо за конструктивное обсуждение. Вот так слово за слово да и получилась дискуссия, из которой зело великую пользу извлечь можно всяк сюда входящему. Сейчас попытаюсь опробовать метод от Mz@2, может, покомпактнее выйдет.
Всех поздравляю с Новым годом! Арсюша.
0
|
|
|
rank1
|
|
| 25.03.2012, 18:22 | |
|
RND во всех языках дают очень плохой результат, для получений нормального генератора нужно использовать конгруэнтные генераторы.
А числа я бы проверял на уникальность с помощью хеша Scripting.Dictionary . Генерить числа и запузыривать их в хеш до тех пор- пока количество элементов хеша<32. Sub Macro1() Dim h As New Scripting.Dictionary, x As Integer, k Randomize While h.count < 32 x = CInt(Rnd() * 32) If Not h.Exists(x) Then h(x) = 1 End If Wend For Each k In h.Keys Debug.Print k Next k Set h = Nothing End Sub |
|
| 25.03.2012, 18:22 | |
|
Помогаю со студенческими работами здесь
20
Помогите с алгоритмом помогите с алгоритмом +) Помогите с алгоритмом Помогите с алгоритмом Помогите с алгоритмом Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога
Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога
В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
|
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|
|
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога
Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
|
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
|
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования.
Часть библиотеки BedvitCOM
Использованы. . .
|
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога
SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
|