Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2006.09.17;
Скачать: [xml.tar.bz2];

Вниз

Нужна 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.039 c
15-1156857160
kobik.
2006-08-29 17:12
2006.09.17
мелкий вопросец


1-1154624425
ISK(CMEPTb)
2006-08-03 21:00
2006.09.17
Вставка объектов в текстовый редактор


15-1156100676
Некто
2006-08-20 23:04
2006.09.17
Не удаляется файл.


1-1154430550
Redline
2006-08-01 15:09
2006.09.17
игнорирование ошибок


2-1155573235
serko
2006-08-14 20:33
2006.09.17
Сетевая база!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский