Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Как присвоить переменной конкретное Rnd значение? Добавлено: 02.08.12 19:36  

Автор вопроса:  merr
Ура, Товарищи! В смысле - привет всем :)
Подскажите пожалуйста, как переменной присвоить конкретное значение Rnd, сгенеренное до этого. Ведь если писать вот так:

Private Sub aRnd ()
Dim a As Single
Rnd
a = Rnd
End Sub

то это инициализирует сам генератор и он присвоит ей уже другое, следующее значение. Наверняка есть простой способ...

Ответить

  Ответы Всего ответов: 10  

Номер ответа: 1
Автор ответа:
 Morpheus



Вопросов: 224
Ответов: 3777
 Web-сайт: xury.zx6.ru
 Профиль | | #1
Добавлено: 02.08.12 19:39
Вопрос по приколу или казино какое ломаешь? =)

Ответить

Номер ответа: 2
Автор ответа:
 Morpheus



Вопросов: 224
Ответов: 3777
 Web-сайт: xury.zx6.ru
 Профиль | | #2
Добавлено: 02.08.12 19:42
Ответ не знаю кстати, но по-моему rnd генерит число, исходя из чила предыдущего. В начале это число 0 или что-то типа системного времени если вызвать Randomize. Так что если где найти код, можно инверсию функции сделать (а может и нельзя в принципе). Код на Rnd не Open Source случаем?

Ответить

Номер ответа: 3
Автор ответа:
 merr



Вопросов: 11
Ответов: 31
 Профиль | | #3 Добавлено: 02.08.12 20:47
Не, казино пусть живет :)
У меня чисто академические цели - моделирование. Не коммерческий проект. Так, на коленке модель, код конечно при желании могу переслать, но вы тут все меня ругать будете, еще побьете :) Кривой он, братцы, однакож фурычит, учусь тока.
Randomize не включаю - значение Rnd в циклах не успевает обновляться (они проходят много быстрее 1 мс).
Однако за идею спасибо - можно же Debug.Print Rnd два раза - имеем два числа, далее попытаться достать формулу обычного, родного VB6 - генератора. Написать инвертирующую функцию которая бы "зеркалила" Rnd...
Это все здорово и интересно, но это не есть простой способ. Буду дальше чесать репу

Ответить

Номер ответа: 4
Автор ответа:
 merr



Вопросов: 11
Ответов: 31
 Профиль | | #4 Добавлено: 02.08.12 23:04
Кажись, дотумкал :)
Читаем MSDN: если указать для Rnd параметр 0, то он выкидывает последнее сгенеренное число:
  1. Private Sub Form_Click()
  2. Me.Print Rnd
  3. Me.Print Rnd(0)
  4. End Sub


Pаботает!

Ответить

Номер ответа: 5
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #5 Добавлено: 03.08.12 19:57
Вообще-то Randomize надо не в цикле вызывать, а один раз перед началом генерации. Можно прямо при запуске приложения.

  1.     public static float Rnd(float Number)
  2.     {
  3.       ProjectData projectData = ProjectData.GetProjectData();
  4.       int num1 = projectData.m_rndSeed;
  5.       if ((double) Number != 0.0)
  6.       {
  7.         if ((double) Number < 0.0)
  8.         {
  9.           long num2 = (long) BitConverter.ToInt32(BitConverter.GetBytes(Number), 0) & (long) uint.MaxValue;
  10.           num1 = checked ((int) (num2 + (num2 >> 24) & 16777215L));
  11.         }
  12.         num1 = checked ((int) ((long) num1 * 1140671485L + 12820163L & 16777215L));
  13.       }
  14.       projectData.m_rndSeed = num1;
  15.       return (float) num1 / 1.677722E+07f;
  16.     }


Исходники VBMath.Rnd из .NET Framework. Нужно проверить, но, по всей вероятности, должна работать так же как и та что в VB6

Ответить

Номер ответа: 6
Автор ответа:
 merr



Вопросов: 11
Ответов: 31
 Профиль | | #6 Добавлено: 03.08.12 20:55
Artyom, спасибо!

Да, так у меня и не в цикле Randomize, один раз вначале - всеравно не то. Ведь он берет "зерно" из значения системного времени, а оно обновляется каждую миллисекунду. Если после этого вызвать Rnd в цикле (а мне это необходимо), а скорость выполнения самого цикла много меньше 1 мс, то значение Rnd не успевает обновиться. Т.к.Randomize в самом начале имеет глобальное действие, то оно справедливо при каждом вызове Rnd. Выло бы здорово если бы можно было ограничивать действие Randomize, скажем, одной процедурой. Или еще круче - гибридный метод: включаем Randomize, если частота обращений к Rnd > 1000 p / сек (т.е. если при очередном обращении, значение системного времени не успело поменяться, то он просто работает как без Randomize, т.е. использует текущее число как "зерно" для генерации следующего! Если при следующем обращении значение системного таймера поменялось, то можно его опять юзать :) Тогда в интервалах менее 1 мс Rnd будет работать как без Randomize, но раз в 1 мс брать значение системного таймера.

Ответить

Номер ответа: 7
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #7 Добавлено: 03.08.12 22:05
merr, похоже что вы вообще не понимаете как работает генератор случайных чисел.

Маловероятно, что вам сейчас требуется что-то кроме Randomize, сделанного при запуске программы.

Ответить

Номер ответа: 8
Автор ответа:
 Morpheus



Вопросов: 224
Ответов: 3777
 Web-сайт: xury.zx6.ru
 Профиль | | #8
Добавлено: 04.08.12 14:36
Всё merr нормально понимает; просто идеи странные воплотить пытается :) Действительно - генератор СЛУЧАЙНЫХ числе, зачем-ж его из static делать non-static? :)

Ответить

Номер ответа: 9
Автор ответа:
 Millenium



ICQ: 629966 

Вопросов: 118
Ответов: 903
 Web-сайт: www.aliyev.us
 Профиль | | #9
Добавлено: 14.08.12 21:36
  1. Dim Random() as Long
  2. Random(0) = Rnd(Time)
  3. Random(1) = Rnd(Time)

Ответить

Номер ответа: 10
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #10 Добавлено: 15.08.12 00:38
1) Массив не проинициализирован
2) Функция Rnd принимает аргумент и сгенерированное число будет лежать между 0 и этим аргументом. Поэтому Time здесь использовать некорректно.
3) Если предполагалось использовать Time в качестве аргумента для Randomize, то опять же, так делать нельзя, так как значение таймера может не успеть измениться и будут сгенерированы одинаковые числа.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам