Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Офф-топ

Страница: 1 |

 

  Вопрос: RND. Не очень-то он рандомен. Добавлено: 02.11.05 23:56  

Автор вопроса:  Victor | Web-сайт: vt-dbnz.narod.ru | ICQ: 345743490 
Я тут пишу 3-хмерный движок. Пока он занимается только рисованием точек.

Так вот разглядывал я вот такой массив точек
n = 4000
For i = 0 To n - 1
    Points(i).Pos.x = (Rnd - 0.5) * 0.1
    Points(i).Pos.y = (Rnd - 0.5) * 0.1
    Points(i).Pos.z = (Rnd - 0.5) * 0.1
    Points(i).Color.rgbRed = Rnd * 255
Next i

И получил забавную картинку. Если на него (кубик) посмотреть с какой-то определенной стороны, получается следующее:
http://vt-dbnz.narod.ru/rnd.png
Забавно, правда?

Можно погучить решетку другой плотности, посмотрев еще с какой-нибудь другой стороны.

Примечание. Команда Randomize не вызывалась. Я не пробовал ее вызывать.

Ответить

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

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



Разработчик Offline Client

Вопросов: 23
Ответов: 879
 Web-сайт: softvito.narod2.ru
 Профиль | | #1
Добавлено: 03.11.05 01:01
Есно дело, что он далек от идеала.

Если тебя интересуют генераторы псевдослучайных чисел, то добро пожаловать к классикам.
Д.Кнут "Исскуство программирования" Том 3. "Получисленные алгоритмы".

Ответить

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



Вопросов: 0
Ответов: 1876


 Профиль | | #2 Добавлено: 03.11.05 02:01
http://bbs.vbstreets.ru/viewtopic.php?p=135910#135910

Ответить

Номер ответа: 3
Автор ответа:
 Павел



Администратор

ICQ: 326066673 

Вопросов: 368
Ответов: 5968
 Web-сайт: www.vbnet.ru
 Профиль | | #3
Добавлено: 03.11.05 11:36
http://vbnet.ru/forum/show.aspx?id=89390

Ответить

Номер ответа: 4
Автор ответа:
 Страшный Сон



Вопросов: 46
Ответов: 848
 Профиль | | #4 Добавлено: 03.11.05 12:01
Есть такой метод генерации случайных чисел:


Private Function RandL() As Long
IRan = 1664525 * IRan + 1013904223
RandL = IRan
End Function


IRan - глобальная переменная. Генерируется при этом целое число. Не самый лучший, честно говоря, метод преобразования в Double выглядит так:

Private Function RandF() As Double
IRan = 1664525 * IRan + 1013904223
RandF = CDbl(IRan) / 4294967296# + 0.5
End Function

Private Function RandFN() As Double
IRan = 1664525 * IRan + 1013904223
RandFN = CDbl(IRan) / 4294967296#
End Function


Не забудь проверку на переполнения вырубить.

Ответить

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


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #5
Добавлено: 04.11.05 10:11
Как раз полиномная (чаще всего использующаяся в стандартных ГСЧ) генерация случайных чисел и приводит к эффектам, вроде диагонального распределения плотности цвета.

Ответить

Номер ответа: 6
Автор ответа:
 Страшный Сон



Вопросов: 46
Ответов: 848
 Профиль | | #6 Добавлено: 04.11.05 12:53
Но если вызвать Randomize, такие артефакты исчезают. На своем опыте убедился.

Ответить

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


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #7 Добавлено: 05.11.05 15:30
а откуда Rnd число генерирует, ну всмысле я так понимаю берётся что-то исходное (например дата и время), далее какой-то алгоритм который генерирует число исходя текущего времени... или я не прав?

Ответить

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



Вопросов: 0
Ответов: 1066
 Профиль | | #8 Добавлено: 05.11.05 17:08
Rnd(base)
генератор случайных чисел обычно берет некое число seed, и base, начинает их жевать по определенному алгоритму и даёт на выходе псевдослучайное число. Один из промежуточных результатов работы генератора сохраняется как новое значение seed, чтобы при последующем обращении не получился тот же результат.
Первоначальная инициализация seed выполняется Randomize

Ответить

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


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #9 Добавлено: 05.11.05 22:23
некое число seed, и base

а чё за это числа и откуда их берут?

Ответить

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



Вопросов: 0
Ответов: 1066
 Профиль | | #10 Добавлено: 05.11.05 22:42
base - это число, которое является параметром функции Rnd. Т.е Rnd(12345) - это base=12345.
Seed - это переменная внутри того модуля (например msvbvm60), который считает случайное число, и которая хранит какое-то начальное значение. Оно меняется, когда вызываешь Randomize. Когда делают Randomize(GetTickCount), то seed устанавливается в некоторое достаточно случайное значение, зависящее от количества мсек, прошедших с момента включения компа. Потом на эту случайную величину наворачивается алгоритмом Rnd ещё другая "случайность", и в итоге получаем случайное число.
Сам алгоритм Rnd рано или поздно начнёт повторять последовательность своих выходных значений, а чтобы этого не происходило, и служит переменная seed. Её нужно почаще переставлять.

Ответить

Номер ответа: 11
Автор ответа:
 Victor



ICQ: 345743490 

Вопросов: 42
Ответов: 385
 Web-сайт: vt-dbnz.narod.ru
 Профиль | | #11
Добавлено: 06.11.05 00:13
Как однако вы меня просветили. Я знал, как применять функцию Randomize и Rnd(), чтобы получить какую-то определенную, довольно случайную последовательность.
Насколько я знаю, в качестве base берется последнее сгенерированное число. Кажется, в MSDN такое написано.
И еще спасибо за инфу о том, как сделать свой рандом-генератор.

Ответить

Номер ответа: 12
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #12 Добавлено: 06.11.05 00:28
Насколько я знаю, в качестве base берется последнее сгенерированное число

base - это входной параметр функции, и последним сгенерированным он быть не может, ибо теряется весь смысл: на входе то же число, что и на выходе :)
Вот пример генератора случайных чисел из masmlib.
base - параметр на входе, внутренняя переменная seed (тут называется nrandom_seed) устанавливается на предпоследнем шаге алгоритма и сохраняется внутри

nrandom PROC base:DWORD

    mov eax, nrandom_seed

  ; ****************************************
    test eax, 80000000h
    jz  @F
    add eax, 7fffffffh
  @@:  
  ; ****************************************

    xor edx, edx
    mov ecx, 127773
    div ecx
    mov ecx, eax
    mov eax, 16807
    mul edx
    mov edx, ecx
    mov ecx, eax
    mov eax, 2836
    mul edx
    sub ecx, eax
    xor edx, edx
    mov eax, ecx
    mov nrandom_seed, ecx
    div base

    mov eax, edx
    ret

nrandom ENDP

Ответить

Номер ответа: 13
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #13 Добавлено: 06.11.05 00:34
Вот кстати процедура установки seed (делает примерно то же, что и Randomize) Первоначально seed равен 12345678, и затем меняется либо непосредственным вызовом этой процедуры, либо при каждой генерации нового случайного числа предыдущей процедурой:

nseed proc TheSeed:DWORD

    .data
      nrandom_seed dd 12345678
    .code

    mov eax, TheSeed
    mov nrandom_seed, eax

    ret

nseed endp

Ответить

Номер ответа: 14
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #14 Добавлено: 07.11.05 19:05
ок, пасиб за просвящение

Ответить

Страница: 1 |

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



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