AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 19.10.2006, 11:41   #1  
Sada is offline
Sada
Программатор
Аватар для Sada
 
1,450 / 153 (8) ++++++
Регистрация: 29.03.2005
Адрес: Толи Барнаул, толи Москва
Angry Random!!!!
Доброго времени суток, уважаемые дамы и господа!!! Есть проблема. При заполнении временной таблицы необходимо одно из полей заполнить случайным числом (не спрашивайте почиму - так надо). В аксапте входящим значением в Random является текущее время (вроде). Если в одну секунду заполняются несколько запеисей, то и значение соответственно равны. А так низяяя!!! Как быть??!!! Подскажите пожалуйста... Заранее благодарен.

PHP код:
void fillTmpReqPoGroups()
{
    
ReqPO                     reqPO;
    
ReqGroup                  reqGroup;
    
InventLocationPriority locationPriority;
    
RandomGenerate random = new RandomGenerate();
    ;
    while (
queryRun.next())
    {
        
reqPO    queryRun.get(tablenum(ReqPO));

        
locationPriority InventLocation::find(reqPO.inventDim().InventLocationId).InventLocationPriority;
        
tmpItemInventDimQty.clear();
        
tmpItemInventDimQty.initFromReqPo(reqPO);
        
tmpItemInventDimQty.RandomFactor                 random.randomInt();
        
tmpItemInventDimQty.PlanningWithSubstituteItems  reqGroup.WW_PlanningWithSubstituteItems;
        
tmpItemInventDimQty.DistributionType             reqGroup.WW_DistributionType;
        
tmpItemInventDimQty.MaxQtySubstituteItems        reqGroup.WW_MaxQtySubstituteItems;
        
tmpItemInventDimQty.InventLocationPriority       locationPriority;
        
tmpItemInventDimQty.insert();
    }

PS: действие происходит в рамках транзакции
За это сообщение автора поблагодарили: mazzy (5).
Старый 19.10.2006, 11:42   #2  
oip is offline
oip
Axapta
Лучший по профессии 2014
 
2,564 / 1416 (53) ++++++++
Регистрация: 28.11.2005
Записей в блоге: 1
А WinAPI::createGUID(); Не пойдет?
Уникальность гарантируется. Правда это не число.

И все же, расскажите плиз смысл этого. Ну очень любопытно.

Последний раз редактировалось oip; 19.10.2006 в 11:46.
За это сообщение автора поблагодарили: iCloud (2).
Старый 19.10.2006, 11:49   #3  
Sada is offline
Sada
Программатор
Аватар для Sada
 
1,450 / 153 (8) ++++++
Регистрация: 29.03.2005
Адрес: Толи Барнаул, толи Москва
Цитата:
Сообщение от oip Посмотреть сообщение
А WinAPI::createGUID(); Правда это не число.
А что это?
Старый 19.10.2006, 11:50   #4  
Dolter is offline
Dolter
1C
1C
 
83 / 18 (1) ++
Регистрация: 18.11.2005
Не знаю как в Аксапте пишется, вот код на одинэске:

Sc = CreateObject("MSScriptControl.ScriptControl");
Sc.Language = "VBscript";
Sc.ExecuteStatement("Randomize");
_Rnd = Sc.Eval("RND");

;-)
Старый 19.10.2006, 11:51   #5  
oip is offline
oip
Axapta
Лучший по профессии 2014
 
2,564 / 1416 (53) ++++++++
Регистрация: 28.11.2005
Записей в блоге: 1
Цитата:
Сообщение от Sada Посмотреть сообщение
А что это?
Что-то типа "00659fd6-0ea9-4897-b226-8b3c74b85d1b".
Уникальнее не придумаешь.
http://ru.wikipedia.org/wiki/GUID
Старый 19.10.2006, 11:54   #6  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Sada Посмотреть сообщение
При заполнении временной таблицы необходимо одно из полей заполнить случайным числом (не спрашивайте почиму - так надо).
Разберитесь с семейством классов BM*. Это BenchMark*

Задача этого модуля - заполнить таблицы случайными значениями (по заданным правилам и диапазонам) и протестировать скорость выполнения операций по заданным сценариям.


То, что вам нужно, выполняет класс BMrandom.
__________________
полезное на axForum, github, vk, coub.
Старый 19.10.2006, 11:55   #7  
Sada is offline
Sada
Программатор
Аватар для Sada
 
1,450 / 153 (8) ++++++
Регистрация: 29.03.2005
Адрес: Толи Барнаул, толи Москва
В сводном планировании создаются спланированные переносы. У каждого склада есть свой приоритет. Раздаем товар сначала складам у которых есть приоритеты (в зависимости от значения приоритета), а затем рэндомом генерим приоритеты тем складам у которых значение ноль. Вот для того чтобы времы от времени появлялся товар на этих складах (где приоритет ноль) и выставляю этот рэндом - некий такой виртуальный приоритет. Мож не совсем по 'научному' объяснил, но вот как то так...
Старый 19.10.2006, 12:02   #8  
Bil Meshkoff is offline
Bil Meshkoff
former champion
Аватар для Bil Meshkoff
 
83 / 30 (2) +++
Регистрация: 09.08.2006
Адрес: USSR
Цитата:
Сообщение от Sada Посмотреть сообщение
Раздаем товар сначала складам у которых есть приоритеты (в зависимости от значения приоритета), а затем рэндомом генерим приоритеты тем складам у которых значение ноль. Вот для того чтобы времы от времени появлялся товар на этих складах (где приоритет ноль) и выставляю этот рэндом - некий такой виртуальный приоритет
Похоже, Ваш руководитель - еще тот массовик-затейник!
__________________
"Let's get ready to r-r-r-um-m-m-mble!!!" (с) M.Buffer
Старый 19.10.2006, 12:04   #9  
Sada is offline
Sada
Программатор
Аватар для Sada
 
1,450 / 153 (8) ++++++
Регистрация: 29.03.2005
Адрес: Толи Барнаул, толи Москва
Цитата:
Сообщение от Bil Meshkoff Посмотреть сообщение
Похоже, Ваш руководитель - еще тот массовик-затейник!
Скучать не приходиться! А это плюс!!!
За это сообщение автора поблагодарили: Bil Meshkoff (1).
Старый 19.10.2006, 12:06   #10  
Sada is offline
Sada
Программатор
Аватар для Sada
 
1,450 / 153 (8) ++++++
Регистрация: 29.03.2005
Адрес: Толи Барнаул, толи Москва
Цитата:
Сообщение от mazzy Посмотреть сообщение
То, что вам нужно, выполняет класс BMrandom.
А можно пример, а то чтото не выходит у меня. Все время одно число 'генерит'.
Старый 19.10.2006, 12:40   #11  
Sada is offline
Sada
Программатор
Аватар для Sada
 
1,450 / 153 (8) ++++++
Регистрация: 29.03.2005
Адрес: Толи Барнаул, толи Москва
Случилось чудо!!! Только метод new этого класса немного доработал...

PHP код:
void new(int seed date2num(SystemDateGet()) + timeNow())
{
    
Session session = new Session();
    
int     _sessionId session.sessionId();
    if (
_sessionId>32768)
        
_sessionId 65536-_sessionId;
    if (
seed == 0// due to midnight timenow() is 0
        
seed 17;
    
prevFraction this.fraction(logn(seed)+logn(_sessionId));
 
//   BMINFO::logEntry(strfmt("%1 %2 %3",prevFraction,_sessionId,seed));

Старый 03.05.2008, 22:16   #12  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Sada Посмотреть сообщение
В аксапте входящим значением в Random является текущее время (вроде).
О-о-о-о! В 4ке также.
Всю голову изломал - почему в отладчике данные случайные, а при нормальной работе много повторяющихся значений.

Т.е. new надо делать один раз, а потом вызывать один экземпляр, или делать singleton...
Спасибо.
__________________
полезное на axForum, github, vk, coub.
Старый 05.05.2008, 13:06   #13  
ivas is offline
ivas
Участник
Аватар для ivas
 
252 / 68 (3) ++++
Регистрация: 22.12.2005
можно в каждой итерации написать
random.parmSeed(WinApi::getTickCount());
WinApi::getTickCount()
гдето 50-100 раз в секунду меняется


__________________
aLL woRk aNd nO JoY MAKes jAck a dULL Boy

Последний раз редактировалось ivas; 05.05.2008 в 13:27.
За это сообщение автора поблагодарили: mazzy (2).
Старый 05.05.2008, 14:15   #14  
epetrov is offline
epetrov
Участник
 
13 / 22 (1) +++
Регистрация: 27.10.2005
Адрес: Казань
Если 4-ка, то можно использовать .Net класс System.Random
X++:
static void Job501(Args _args)
{
    System.Random random;
    Int i;
    Int r;
    ;
    
    random = new System.Random();
    
    for (i=1; i<=10; i++)
    {
        r = random.Next(0, 10);
        info(int2Str(r));
 
    }

}
Старый 05.05.2008, 18:00   #15  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
ivas, спасибо.

Цитата:
Сообщение от epetrov Посмотреть сообщение
Если 4-ка, то можно использовать .Net класс System.Random
Ой, надо бы протестировать на производительность.
__________________
полезное на axForum, github, vk, coub.
Старый 06.05.2008, 12:48   #16  
epetrov is offline
epetrov
Участник
 
13 / 22 (1) +++
Регистрация: 27.10.2005
Адрес: Казань
Цитата:
Ой, надо бы протестировать на производительность.
Результаты тестирования System.Random против RandomGenerate
X++:
static void Job502(Args _args)
{
    System.Random  randomNet;
    RandomGenerate randomAx;
    Int r;
    ;

    randomNet = new System.Random(); // 343112 Такты
    randomAx = new RandomGenerate(); // 43827   Такты
    r = randomNet.Next(0, 10);                // 119623 Такты
    r = randomAx.randomInt(0, 10);         //  279566 Такты
}
Т.е. получилось, что .Net класс почти в 8 раз проигрывает при создании объекта, но 2.3 раза выигрывает при генерации случайного значения. При этом время создания объекта System.Random сопоставимо с временем генерации случайного значения из RandomGenerate.

Последний раз редактировалось epetrov; 06.05.2008 в 12:55.
За это сообщение автора поблагодарили: mazzy (5).
Старый 06.05.2008, 13:00   #17  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
спасибо.
Т.е. как и Аксаптовский, дотнетовский рандом лучше создавать один раз, а потом вызывать-вызывать-вызывать.

еще бы анализ случайности и воспроизводимости...
__________________
полезное на axForum, github, vk, coub.
Старый 06.05.2008, 13:13   #18  
epetrov is offline
epetrov
Участник
 
13 / 22 (1) +++
Регистрация: 27.10.2005
Адрес: Казань
Цитата:
еще бы анализ случайности и воспроизводимости...
Что Вы понимаете под воспроизводимостью? поясните.
Старый 06.05.2008, 13:36   #19  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
воспроизводимость - способность генератора выдавать одинаковые последовательности при одинаковом значении seed

http://ru.wikipedia.org/wiki/%D0%93%...81%D0%B5%D0%BB
http://ru.wikipedia.org/wiki/%D0%A2%...%D1%8B_DIEHARD
__________________
полезное на axForum, github, vk, coub.
Старый 06.05.2008, 14:05   #20  
epetrov is offline
epetrov
Участник
 
13 / 22 (1) +++
Регистрация: 27.10.2005
Адрес: Казань
понятно.

Пока анализ случайности. Значения от 1 до 10.

1000 генераций
Распределение System.Random: 1 - 11,70 %, 2 - 8,70 %, 3 - 9,80 %, 4 - 11,00 %, 5 - 9,80 %, 6 - 10,20 %, 7 - 10,40 %, 8 - 10,10 %, 9 - 9,60 %, 10 - 8,70 %
Распределение RandomGenerate: 1 - 11,40 %, 2 - 9,30 %, 3 - 12,60 %, 4 - 8,10 %, 5 - 10,50 %, 6 - 10,20 %, 7 - 9,10 %, 8 - 9,60 %, 9 - 9,90 %, 10 - 9,30 %

10000 генераций
Распределение System.Random: 1 - 10,49 %, 2 - 9,58 %, 3 - 9,99 %, 4 - 10,42 %, 5 - 9,78 %, 6 - 10,08 %, 7 - 9,30 %, 8 - 10,14 %, 9 - 10,22 %, 10 - 10,00 %
Распределение RandomGenerate: 1 - 9,66 %, 2 - 10,75 %, 3 - 9,66 %, 4 - 10,12 %, 5 - 10,01 %, 6 - 10,22 %, 7 - 9,77 %, 8 - 9,97 %, 9 - 10,20 %, 10 - 9,64 %

100000 генераций
Распределение System.Random: 1 - 9,86 %, 2 - 10,22 %, 3 - 10,04 %, 4 - 9,93 %, 5 - 10,00 %, 6 - 10,01 %, 7 - 10,03 %, 8 - 9,96 %, 9 - 10,01 %, 10 - 9,94 %
Распределение RandomGenerate: 1 - 10,18 %, 2 - 10,12 %, 3 - 9,97 %, 4 - 10,03 %, 5 - 9,95 %, 6 - 9,98 %, 7 - 9,96 %, 8 - 9,74 %, 9 - 10,03 %, 10 - 10,05 %

1000000 генераций
Распределение System.Random: 1 - 9,96 %, 2 - 10,04 %, 3 - 9,96 %, 4 - 10,02 %, 5 - 10,00 %, 6 - 9,94 %, 7 - 10,01 %, 8 - 10,01 %, 9 - 10,05 %, 10 - 10,01 %
Распределение RandomGenerate: 1 - 10,03 %, 2 - 10,01 %, 3 - 10,03 %, 4 - 10,03 %, 5 - 10,03 %, 6 - 10,01 %, 7 - 9,93 %, 8 - 10,02 %, 9 - 9,96 %, 10 - 9,95 %

Последний раз редактировалось epetrov; 06.05.2008 в 14:20.
Теги
random, документация, случайное число

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Ruslan Goncharov: Stereogram in AX Blog bot DAX Blogs 0 30.05.2008 18:05
Программирование и перенос Layer-а на другую апликацию, выдает random-ошибки .. Delfins DAX: Программирование 10 04.04.2006 17:03
random() ? slava DAX: Программирование 2 26.09.2002 12:22
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 15:21.