Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.09.17;
Скачать: CL | DM;

Вниз

Нужна UDF, генерирующая случайные числа   Найти похожие ветки 

 
kaif ©   (2006-07-16 15:33) [0]

Имеющаяся rand делает что-то не то.


 
Johnmen ©   (2006-07-16 16:29) [1]

В RFUNC есть. InitRandom и GetRandom.


 
Desdechado ©   (2006-07-16 19:35) [2]

> делает что-то не то
А что должна?
Какой закон распределения? С какими параметрами?


 
kaif ©   (2006-07-16 20:14) [3]

2 Johnmen ©   (16.07.06 16:29) [1]
Спасибо. А где можно скачать эту RFUNC?

В принципе я выкрутился проще - загнал со стороны клиента 10 тыс записей случайных чисел [0...999] подряд в таблицу с ключом ID [0...10000]. И сейчас просто юзаю эту таблицу, состоящую из 2-х полей (ключевого и "случайного").

2 Desdechado ©   (16.07.06 19:35) [2]
Да просто равномерного распределения мне пока хватает.
Обычный генератор.
Если нужны особенные распределения, я просто разбиваю диапазон случайных чисел на дискретные неодинаковые по ширине поддиапазоны и так вылавливаю нужные мне распределения.

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


 
Johnmen ©   (2006-07-16 20:50) [4]


> kaif ©   (16.07.06 20:14) [3]
> А где можно скачать эту RFUNC?


Ну-у-у-у, Ашот..... Спроси у Яндекса, например....:)


 
kaif ©   (2006-07-17 13:12) [5]

Поставил RFUNC.
Функция GETRANDOM работает.
Но почему-то гораздо медленнее, чем моя выборка одной записи из таблицы в 100 тыс заранее подготовленных случайных чисел :(


 
kaif ©   (2006-07-17 13:24) [6]

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


 
kaif ©   (2006-07-17 13:25) [7]

2 Johnmen ©   (16.07.06 16:29) [1]
Спасибо!


 
kaif ©   (2006-07-17 16:46) [8]

Странно, но внутри хранимой процедуры последовательные вызовы в цикле функции getrandom возвращают одно и то же значение. Что-то работает не так...


 
Johnmen ©   (2006-07-17 16:52) [9]


> kaif ©   (17.07.06 16:46) [8]


Ашот, ты забыл InitRandom.


 
kaif ©   (2006-07-17 17:25) [10]

2 Johnmen ©   (17.07.06 16:52) [9]
Нет, не забыл. С ним еще хуже.

Вот в селекте getrandom работает правильно.
Например:

SELECT GETRANDOM(1000) FROM TABLE_WITH_100_RECORDS

действительно вернет 100 случайных значений

А если написать  в ХП так:

I = 0;
WHILE (I < 100) DO
BEGIN
 SELECT GETRANDOM(1000) FROM RDB$DATABASE INTO :A;
 SELECT GETRANDOM(1000) FROM RDB$DATABASE INTO :B;
 SELECT GETRANDOM(1000) FROM RDB$DATABASE INTO :C;
END

то оказываются A=B=C

А мне нужно было как раз, чтобы они оказались разными.
(Я генерю из фамилий, имен и отчеств тестовую базу с миллионом записей.)


 
Johnmen ©   (2006-07-17 17:34) [11]


> kaif ©   (17.07.06 17:25) [10]


М.б. надо разбодяжить
SELECT GETRANDOM(1000) FROM ...
вызовами InitRandom?


 
Desdechado ©   (2006-07-17 17:39) [12]

мож, я чегоне понимаю, но проще
a = GETRANDOM(1000);
вместо
SELECT GETRANDOM(1000) FROM RDB$DATABASE INTO :A;


 
kaif ©   (2006-07-17 17:47) [13]

Desdechado ©   (17.07.06 17:39) [12]
мож, я чегоне понимаю, но проще
a = GETRANDOM(1000);
вместо
SELECT GETRANDOM(1000) FROM RDB$DATABASE INTO :A;


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

2 Johnmen ©   (17.07.06 17:34) [11]

Не знаю. Я долго мучился. Вернулся к выборке из таблицы случайных чисел. Просто времени нет на эксперименты с GETRANDOM. Потом как-нибудь получше изучу поведение этой функции. INITRANDOM не спасала.


 
atruhin ©   (2006-07-17 18:14) [14]

Только что попробовал:
CREATE PROCEDURE NEW_PROCEDURE
RETURNS (
   A INTEGER,
   B INTEGER,
   C INTEGER)
AS
begin
 a = getRANDOM(100);
 b = getRANDOM(100);
 c = getRANDOM(100);
 /* Procedure Text */
 suspend;
end
Результат:
A=44; B = 4; C = 86;


 
kaif ©   (2006-07-17 18:44) [15]

2 atruhin ©   (17.07.06 18:14) [14]
Попробуй так:

ALTER PROCEDURE NEW_PROCEDURE
RETURNS (
  A INTEGER,
  B INTEGER,
  C INTEGER)
AS
declare variable n integer;
begin
 n = 0;
 while n < 10 do
 begin
   a = getRANDOM(100);
   b = getRANDOM(100);
   c = getRANDOM(100);
   suspend;
   n = n + 1;
 end
end


 
atruhin ©   (2006-07-17 18:55) [16]

Работает:
A B C
49 4 86
44 12 83
56 34 86
61 61 44
0 32 43
79 13 98
6 45 61
91 92 37
43 12 28
59 59 25


 
PEAKTOP ©   (2006-07-17 18:59) [17]


library my_udf_lib;

function my_lib_random:extended;cdecl;
begin
 Result := Random; // returns random value from 0 to 1
end;

function my_lib_randomize<>:longint;cdecl;
begin
 Randomize;
 Result := 1;
end;

exports
 my_lib_random,
 my_lib_randomize;

end.

---------------------------------------------------------------------------

DECLARE EXTERNAL FUNCTION MY_RANDOM
RETURNS DOUBLE PRECISION BY VALUE
ENTRY_POINT "my_lib_random" MODULE_NAME "my_udf_lib";

DECLARE EXTERNAL FUNCTION MY_RANDOMIZE
RETURNS DOUBLE PRECISION BY VALUE
ENTRY_POINT "my_lib_randomize" MODULE_NAME "my_udf_lib";

---------------------------------------------------------------------------

CREATE PROCEDURE NEW_PROCEDURE
RETURNS (
  A INTEGER,
  B INTEGER,
  C INTEGER
)
AS
begin
 MY_RANDOMIZE;
 A = IBUDF_ROUND(MY_RANDOM * 100);
 B = IBUDF_ROUND(MY_RANDOM * 100);
 C = IBUDF_ROUND(MY_RANDOM * 100);
 SUSPEND;
END


 
Johnmen ©   (2006-07-17 20:04) [18]


> PEAKTOP ©   (17.07.06 18:59) [17]


Ты думаешь, что в RFUNC реализация этих функций иная?


 
kaif ©   (2006-07-17 20:17) [19]

2 atruhin ©   (17.07.06 18:55) [16]
Значит я где-то ошибся.
У меня правда процедура была посложнее, а такой простой эксперимент не поставил - быстро начал нервничать - ничего не выходило.
Хотя по сути было почти то же, что и у тебя.
Странно.
Ладно, я еще вернусь к этой функции скоро.
Просто сейчас заново миллион записей генерировать неохота.
Я уже и так его несколько раз генерил...


 
kaif ©   (2006-07-17 20:19) [20]

2 atruhin ©  
В любом случае спасибо и тебе и Johnmen-у и Desdechado ©  
Я как-то раньше не работал с RFUNC (страдал минимализмом).
Вижу здесь много чего полезного можно найти.


 
PEAKTOP ©   (2006-07-18 13:44) [21]


> Johnmen ©   (17.07.06 20:04) [18]
> Ты думаешь, что в RFUNC реализация этих функций иная?

Не думаю. просто тема топика Нужна UDF, генерирующая случайные числа
Какой вопрос - такой ответ :))))



Страницы: 1 вся ветка

Текущий архив: 2006.09.17;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.048 c
15-1156852032
RomanH
2006-08-29 15:47
2006.09.17
Курсы валют


2-1156506003
Alral
2006-08-25 15:40
2006.09.17
Разбитие строки.


3-1152611860
rav
2006-07-11 13:57
2006.09.17
Обновление одной записи.


15-1155539935
Gydvin
2006-08-14 11:18
2006.09.17
Формат GIF стал свободным


15-1156760662
Иксик
2006-08-28 14:24
2006.09.17
Думкину