Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.68/19: Рейтинг темы: голосов - 19, средняя оценка - 4.68
0 / 0 / 0
Регистрация: 27.02.2012
Сообщений: 21

Помогите с алгоритмом Rnd

27.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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.02.2012, 03:35
Ответы с готовыми решениями:

Шифрование алгоритмом моноалфавитной подстановки и Алгоритмом Цезаря
Здравствуйте, помогите исправить код чтобы выводилось одинаково зашифрованное сообщение, и методом моноалфавитной подстоновкой и методом...

Помогите с алгоритмом
Всем привет! Второй день мучаюсь, помогите с проблемкой разобраться. Необходимо создать отчёт "Табель учёта рабочего...

Помогите с алгоритмом!
Задача такая..Есть здоровая формула типа ds/dt =V0*Exp(qr/T)...нужно осуществить проверку правильно ли мы набрали формулу, зная, что у нас...

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 элемента, но не заполнял.
при каждом рнд делал
Code
1
2
3
4
5
6
7
8
for i=0 to 32
a: x=rnd
if arr(x)=0 then 
   arr(x)=1 
else 
   goto a
end if
next
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
Обобщая и исправляя все вышеописанное:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Option Explicit
 
Sub MyRND()
    Dim I As Integer
    Dim X As Integer
    Dim Arr(1 To 32) As Integer
    Randomize
    
    
    Do
        X = CInt(Rnd(1) * 31 + 1)
        If Arr(X) = 0 Then
            I = I + 1
            Arr(X) = I
        End If
    Loop While I < 32
 
''''''''''''''''''''''''''''''''''
    For I = 1 To 32
        Debug.Print Arr(I)
    Next I
End Sub
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.03.2012, 18:22
Помогаю со студенческими работами здесь

Помогите с алгоритмом
Даны координаты вершин двух трапеций. нужно проверить вложена ли одна трапеция в другую . Подскажите какую-нибудь идею, а то у меня...

помогите с алгоритмом +)
Огромная просьба! Очень нужна помощь в составлении блок-схемы алгоритмов. 1) Составить схему алгоритма подсчета в последовательности...

Помогите с алгоритмом
Вот такая задача &quot;Определить вид треугольника (равносторонний, равнобедренный, разносторонний) по заданным длинам его сторон.&quot; нужно...

Помогите с алгоритмом
Всем доброго времени суток.У меня есть проблема со следующим заданием: Дано натуральное число m. Необходимо вставить между некоторыми...

Помогите с алгоритмом
Нужно написать программу сравнения 3 чисел. Без использования массивов, функций, управляющего else. то есть только используя if


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
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(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru