Полигон 1С
06 Февраль 2012, 09:34:52 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: НОВЫЕ РАЗДЕЛЫ НА ФОРУМЕ: РАБОТА И ОБРАЗОВАНИЕ, КЛУБ ПУТЕШЕСТВЕННИКОВ, БЫТОВАЯ ТЕХНИКА, ПОЛИТИКА И ЭКОНОМИКА, ЗДОРОВЬЕ, БИБЛИОТЕКА, КУХНЯ, БАРНАЯ СТОЙКА
Расширенный поиск  
Страниц: [1]   Вниз
Печать
Автор Тема: v8: Функция для получения случайных чисел  (Прочитано 2264 раз)
0 Пользователей и 1 Гость смотрят эту тему.
alexey
Гость
« : 12 Декабрь 2007, 11:56:08 »

//только для целых чисел
Функция ПолучитьСлучайноеЧисло(Мин,Макс)
   
    //вместо Randomize
    Для н = 1 По 100 Цикл
        Уник = Новый УникальныйИдентификатор;
    КонецЦикла;
   
        //генерируем GUID
    Уник = СокрЛП(Новый УникальныйИдентификатор);

        //оставляем только цифры
    Уник = СтрЗаменить(Уник,"-","");
    Уник = СтрЗаменить(Уник,"a","");
    Уник = СтрЗаменить(Уник,"b","");
    Уник = СтрЗаменить(Уник,"c","");
    Уник = СтрЗаменить(Уник,"d","");
    Уник = СтрЗаменить(Уник,"e","");
    Уник = СтрЗаменить(Уник,"f","");

    //знаменатель должен иметь такое же количество нулей + 1
    Знаменатель = 10;
    Для н = 2 По (СтрДлина(СтрЗаменить(Уник,Символы.НПП,""))) Цикл
        Знаменатель = Знаменатель * 10;
    КонецЦикла;
   
    Случ = Число(Уник) / Знаменатель; //здесь получается дробное случайное число от 0 до 1
   
    //преобразуем его в случайное число из заданного интервала, округляем до целого
    ЧислоИзИнтервала = Мин(Макс(Окр(Мин + (Макс-Мин)*Случ),Мин),Макс);
   
    Возврат ЧислоИзИнтервала;

КонецФункции
« Последнее редактирование: 12 Декабрь 2007, 13:24:21 от alexey » Записан
ink
Старожил
****

Карма: +7/-0
Offline Offline

Сообщений: 332



« Ответ #1 : 12 Декабрь 2007, 13:05:19 »

Красиво...
Только вот изза этого
Уник = СтрЗаменить(Уник,"-","");
    Уник = СтрЗаменить(Уник,"a","");
    Уник = СтрЗаменить(Уник,"b","");
    Уник = СтрЗаменить(Уник,"c","");
    Уник = СтрЗаменить(Уник,"d","");
    Уник = СтрЗаменить(Уник,"e","");
    Уник = СтрЗаменить(Уник,"f","");
закон распределения непонятно какой получается...
и Уж если 1Совскую генерацию гуида принять как равномерное, то я бы реально в цикле перевел бы 16ричное число в десятеричное, ну и на максимум поделил - 16 в 32й степени чтоли там... токо потянет ли 1С такую размерность цифр не знаю - должна.

А зачем ваще понадобилось - если не секрет?
Записан

Типа дисклеймер: Все вышесказанное и молча подуманное является полнейшим ИМХО и на истину в последней инстанции не претендует.

умный программист пишет тупым кодом гениальные вещи а не наоборот... (c) bash.org.ru
alexey
Гость
« Ответ #2 : 12 Декабрь 2007, 13:25:50 »

Ну давай и твой вариант попробуем, бросай сюда, а потом сделаем замеры что да как.. В разрезе скорость/качество Подмигивающий..
Записан
ink
Старожил
****

Карма: +7/-0
Offline Offline

Сообщений: 332



« Ответ #3 : 12 Декабрь 2007, 14:47:33 »

скорость одинаково будет думаю
качество хз
у меня ваще вариант не написан, это я просто сказал как бы я писал - а писать лень :P
я и спросил зачем тебе понадобилось такое поэтому...
Записан

Типа дисклеймер: Все вышесказанное и молча подуманное является полнейшим ИМХО и на истину в последней инстанции не претендует.

умный программист пишет тупым кодом гениальные вещи а не наоборот... (c) bash.org.ru
alexey
Гость
« Ответ #4 : 12 Декабрь 2007, 15:19:00 »

скорость одинаково будет думаю
качество хз
у меня ваще вариант не написан, это я просто сказал как бы я писал - а писать лень :P
я и спросил зачем тебе понадобилось такое поэтому...
Ну яки таки только чудеса в жизни не требуются Подмигивающий.. Вот и пригодилось.
Записан
Vasko
Ветеран
*****

Карма: +8/-0
Offline Offline

Сообщений: 577



« Ответ #5 : 06 Февраль 2008, 11:33:35 »

Где то читал, что если подбрасывать монету бесконечное число раз, то чем чаще её подбрасываешь, тем больше число выпадений орлом, будет стремиться к числу выпадения решкой
Хе Хе Хе!  Подмигивающий
Если делать это:
Цитировать
Уник = СтрЗаменить(Уник,"-","");
    Уник = СтрЗаменить(Уник,"a","");
    Уник = СтрЗаменить(Уник,"b","");
    Уник = СтрЗаменить(Уник,"c","");
    Уник = СтрЗаменить(Уник,"d","");
    Уник = СтрЗаменить(Уник,"e","");
    Уник = СтрЗаменить(Уник,"f","");

То числа будут не совсем случайные получаться, а с акцентом на определенную цифру, но, правда случайную, например ПолучитьСлучайноеЧисло(1,5)={4,4,4,5,4,4,4,1,1,2,1,4,4,4,5,5,3,3,4,1,4,} здесь преобладает "4". В других случаях может преобладать любая другая цифра. Но последовательность эта будет "не очень случайной", так как в случайной последовательности количество различных образующих её элементов должно стремиться к равенству между собой. Например, в первом миллионе элементов последовательности только из 1,2,3 единица может встречаться 333330 раз, а двойка тогда 333336 раз. Следовательно, тройка будет встречена в 333334 раза.
Поэтому лучше все-таки преобразовывать число из шестнадцатеричного в десятичный формат, тогда не будут исключаться дополняющие последовательность цифры :)
Записан
Vasko
Ветеран
*****

Карма: +8/-0
Offline Offline

Сообщений: 577



« Ответ #6 : 06 Февраль 2008, 11:35:16 »

А зачем ваще понадобилось - если не секрет?
Можно, например, написат какую-нибудь игровую обработку для бухгалтеров  :D
Записан
Страниц: [1]   Вверх
Печать
 
Перейти в:  

�������@Mail.ru Rambler Top100
 
Powered by SMF 1.1.11 | SMF © 2006-2008, Simple Machines LLC | © 2008 Полигон 1С