Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Неправильная работа exe, работа с рнд 
:(
    Опции темы
neiron
Дата 29.4.2007, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Написал незатейливую программулину... 
Есть форма, есть классмодуль, есть файл ресурсов, есть обычный модуль.

На форме поле 10*10. Каждая клетка в зависимости от значения объекта в массиве имеет определёный рисунок. 
При этом в форме происходит прорисовка, в классмодуле по сути ничего интересного не происходит, в ьодуле происходит следующее:

Код

Option Explicit
Dim i As Integer, j As Integer, k As Integer

Const ColKl As Integer = 50
Public Gr(1 To ColKl, 1 To ColKl) As New Ground

Public Sub Generation()
Dim per As Double
Randomize Timer
    For i = 1 To ColKl
        For j = 1 To ColKl
            Gr(i, j).X = i
            Gr(i, j).Y = j
            per = Rnd(1)
            If per < 0.25 Then
                Gr(i, j).GrType = 2    
                Gr(i, j).DopType = Int(Rnd(1) * 3) + 1
                Select Case Gr(i, j).DopType
                    Case 1
                        Gr(i, j).DobMet = 0
                        Gr(i, j).DobGl = 0
                        Gr(i, j).DobFor = 25
                        Gr(i, j).DobZer = 0
                    Case 2
                        Gr(i, j).DobMet = 25
                        Gr(i, j).DobGl = 0
                        Gr(i, j).DobFor = 0
                        Gr(i, j).DobZer = 0
                    Case 3
                        Gr(i, j).DobMet = 0
                        Gr(i, j).DobGl = 0
                        Gr(i, j).DobFor = 0
                        Gr(i, j).DobZer = 25
                End Select
            Else
                If per < 0.65 Then
                    Gr(i, j).GrType = 1 
                    Gr(i, j).DopType = Int(Rnd(1) * 10) + 1
                        Gr(i, j).DobZer = CByte(Rnd(1) * 8)
                        Gr(i, j).DobMet = CByte(Rnd(1) * (18 - Gr(i, j).DobZer) / 2)
                        Gr(i, j).DobGl = CByte(Rnd(1) * (18 - Gr(i, j).DobZer - Gr(i, j).DobMet) * 2 / 3)
                        Gr(i, j).DobFor = 18 - Gr(i, j).DobZer - Gr(i, j).DobMet - Gr(i, j).DobGl
                Else
                    Gr(i, j).GrType = 0     
                    Gr(i, j).DopType = 1
                    Gr(i, j).DobMet = 4
                    Gr(i, j).DobGl = 4
                    Gr(i, j).DobFor = 4
                    Gr(i, j).DobZer = 6
                End If
            End If
        Next j
    Next i
End Sub


В общем, создаётся массив 50*50 объектов моего класса. Рэндомно определяются свойства. 

В чём проблема (быть может зря так много расписывал):
запускаю из среды: всё работает как надо - рэндомная генерация, правильное отображение клеток на форме.
делаю экзешник, запускаю - 
Gr(i, j).GrType = 1 только для первого столбца массива. Т.е. в только Gr(1, n) может иметь GrType равный единице, при этом не все объекты первого столбца имеют GrType=1... Соответствено, неправильно отображаются клетки... 
В чём может быть беда?
PM MAIL   Вверх
neiron
Дата 29.4.2007, 23:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вместо if...end if заюзал select...end select и всё заработало как надо.
Кто-нибудь может сказать в чём дело было?
PM MAIL   Вверх
Tectoder
Дата 30.4.2007, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



neiron, к слову, соврешенно незачем передавать в Rnd все время число 1 этим ты только "ухудшаешь" случайность чисел. Ты, вероятно, полагаешь что 1 - это верхняя граница для rnd? Нет, это совсем другое.
PM   Вверх
neiron
Дата 30.4.2007, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Tectoder, насколько я помню из школьного курса QB, 1 как раз определяет предел... Или быть может нам неправильно объясняли... Но её оттуда у меня привычка ставить везде rnd(1)... Прочитал доки:

Цитата

Если параметр number        То функцией Rnd генерируется 
Меньше нуля       Каждый раз одно и то же число, при этом аргумент number используется как начальное значение. 
Больше нуля        Следующее случайное число в последовательности. 
Равно нулю          Последнее сгенерированное случайное число. 
Не задается         Следующее случайное число в последовательности. 



Примечания
Функция Rnd возвращает значение, которое меньше единицы, но больше или равно нулю.

Cпособ генерации случайного числа в функции Rnd определяется значением параметра number:

Для любого заданного начального числа генерируется одна и та же последовательность чисел, поскольку при каждом последующем вызове в функции Rnd при генерации следующего числа последовательности в качестве начального используется ранее сгенерированное число.

Перед вызовом Rnd для инициализации генератора случайных чисел с начальным значением на основе системного таймера воспользуйтесь оператором Randomize без указания аргументов.


Т.е. как я понимаю задавать 1 или оставлять пустым без разницы... Но если это плохо, то тогда надо 0 задавать? И что это даст?
Стартовое число получается всегда 1... Но из-за Randomize Timer (как я понимаю, можно просто randomize?) принцип генерации всё время разный, т.е. тут тогда вообще нет смысла ставить какой-либо аргумент в rnd()?



ЗЫ. Извиняюсь за 2 вопроса в одной теме, но всё же))

PM MAIL   Вверх
Tectoder
Дата 30.4.2007, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(neiron @  30.4.2007,  10:11 Найти цитируемый пост)
т.е. тут тогда вообще нет смысла ставить какой-либо аргумент в rnd()?
Да, просто rnd() и все
Цитата(neiron @  30.4.2007,  10:11 Найти цитируемый пост)
как я понимаю, можно просто randomize?
Да
Цитата(neiron @  30.4.2007,  10:11 Найти цитируемый пост)
Т.е. как я понимаю задавать 1 или оставлять пустым без разницы
Глянул в MSDN и прадва, значение большее нуля игнорируется. Короче, лучше писать просто rnd без параметров
PM   Вверх
neiron
Дата 30.4.2007, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Нет, ну не зря же придумывали параметр... Видимо, где-то когда-то он применяется? Кто-нибудь знает где и когда?

И что же всё-таки с if и selecct case? В чём причина ошибки?
PM MAIL   Вверх
bom
Дата 1.5.2007, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 329
Регистрация: 22.2.2004
Где: Казахстан, Алматы

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



Цитата(neiron @  1.5.2007,  01:09 Найти цитируемый пост)
 не зря же придумывали параметр...  где-то когда-то он применяется? Кто-нибудь знает где и когда?

Я знаю кто это может быть.

Обычный чел, каждый день ходит на неинтересную, выматывающую работу, помогает выносить мусор соседям по лестничной клетке, а ночью, устав от трудов праведных, спит, сидя у домашнего компа, положив голову на клавиатуру вместо подушки. Знания, информация беспрепятственно, неконтролируемо перетекают из клавы непосредственно в моск нашего кролика, находящегося в безсознательном состоянии. 
Так продолжалось какое то время, пока согласно глобальным законам, количество не переросло в качество. Не написав ни строчки кода, не прочитав ни страницы мануала, он становится Избранным. Теперь ему известно все и подвластно - все!


Сорри за оффтоп, навеяно известным фильмом smile
Открыл учебник и скопировал тебе следующую инфу:
Код

Синтаксис

Rnd[(число)]

Необязательный аргумент число представляет значение типа Single или любое допустимое числовое выражение.

Возвращаемые значения

Если число:     Rnd возвращает:

Меньше нуля     Каждый раз одно и то же число, используя аргумент число в качестве опорного числа.
Больше нуля     Следующее случайное число в последовательности.
Равняется нулю     Случайное число, возвращенное при предыдущем вызове этой функции.
Не указано     Следующее случайное число в последовательности.

Дополнительные сведения

Функция Rnd возвращает значение, меньшее 1 и большее или равное нулю.
Аргумент число определяет способ генерации случайного числа функцией Rnd:
При использовании одинаковых опорных чисел получаются одинаковые последовательности случайных чисел, поскольку при генерации каждого следующего члена последовательности используется предыдущий член.
Перед вызовом функции Rnd используйте инструкцию Randomize без аргумента для инициализации генератора случайных чисел значением, возвращаемым системным таймером.

Ниже приведена формула, предназначенная для получения случайных целых чисел в заданном диапазоне:

Int((верхняяГраница - нижняяГраница+ 1) * Rnd + нижняяГраница)

Здесь верхняяГраница представляет максимальное число в диапазоне, а нижняяГраница минимальное число в диапазоне.

Примечание.   Для повторения последовательности случайных чисел следует вызвать функцию Rnd с отрицательным аргументом сразу после использования инструкции Randomize с числовым аргументом.  Повторное использование инструкции Randomize с тем же числовым аргументом не приведет к повторению предыдущей последовательности случайных чисел.

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


Шустрый
*


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

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



bom, хм... и?

если аргумент меньше 0, то последовательность будет типа 
0.34363 0.34363 0.34363 0.34363 0.34363 0.34363 
если ставить Randomize 1 всегда

а если =0? Будет возвращено число вызванное именно в этой строчке ранее? или вообще хоть где в коде? 
Ничего не понимаю(с)  smile 


И в чём всё же тайна if...select?)))
PM MAIL   Вверх
bom
Дата 2.5.2007, 03:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 329
Регистрация: 22.2.2004
Где: Казахстан, Алматы

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



Цитата(neiron @  2.5.2007,  01:22 Найти цитируемый пост)
хм... и?

По моему, там все понятно написано... Не знаю, что и как тут можно еще дополнительно разжевывать.
Создай процедуру типа:
Код

Private Sub Command1_Click()
Debug.Print Rnd(число)
End Sub

и долби ее, меняя число, до полного просветления.



PM MAIL   Вверх
Tectoder
Дата 2.5.2007, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Или вообще, нажми Ctrl+L и напиши там 
Код
? rnd(2)
 smile 

Это сообщение отредактировал(а) Tectoder - 2.5.2007, 11:52
PM   Вверх
neiron
Дата 2.5.2007, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



теперь понятно))) спасибо

и что же всё же с главным вопросом темы?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "VB6"
Akina

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по VB обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • Используйте теги [code=vb][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.


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

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


 




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


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

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