LINUX.ORG.RU

исполнение random

 , , , ,


0

1

Доброго времени всем Кто знает как браузер выполняет в jscript команду Math.flor(Math.random(max-min)+min))? Интересует не общая тема, что есть такие алгоритмы. А какая часть кода (в Mozilla FireFox) отвечает именно за исполнение генератора случайного числа от мин до макс. Где искать исполнительный алгоритм, если он выполняется не в браузере, а в ОС (интересует Убунту16 и Вин10). Какие варианты исполнения могут существовать?


Ответ на: комментарий от MozBd

Для виндовс RtlGenRandom, для эпла arc4random.

Для линукс сначала попытка через getrandom syscall, если не получилось то уже из /dev/urandom (по условию !done).

И, /dev/urandom есть не только в линукс, поэтому в отдельной ветке.

vvn_black ★★★ ()
Последнее исправление: vvn_black (всего исправлений: 1)
Ответ на: комментарий от MozBd
#if defined(XP_WIN)                                                                                                                                                                      
    MOZ_ALWAYS_TRUE(RtlGenRandom(&seed, sizeof(seed)));                                                                                                                                  
#elif defined(HAVE_ARC4RANDOM)                                                                                                                                                           
    seed = (static_cast<uint64_t>(arc4random()) << 32) | arc4random();                                                                                                                   
#elif defined(XP_UNIX)                                                                                                                                                                   
    bool done = false;                                                                                                                                                                   
# if defined(__linux__)                                                                                                                                                                  
    // Try the relatively new getrandom syscall first. It's the preferred way                                                                                                            
    // on Linux as /dev/urandom may not work inside chroots and is harder to                                                                                                             
    // sandbox (see bug 995069).                                                                                                                                                         
    int ret = syscall(SYS_getrandom, &seed, sizeof(seed), GRND_NONBLOCK);                                                                                                                
    done = (ret == sizeof(seed));                                                                                                                                                        
# endif                                                                                                                                                                                  
    if (!done) {                                                                                                                                                                         
        int fd = open("/dev/urandom", O_RDONLY);                                                                                                                                         
        if (fd >= 0) {                                                                                                                                                                   
            mozilla::Unused << read(fd, static_cast<void*>(&seed), sizeof(seed));                                                                                                        
            close(fd);                                                                                                                                                                   
        }                                                                                                                                                                                
    }                                                                                                                                                                                    
#else                                                                                                                                                                                    
# error "Platform needs to implement GenerateRandomSeed()"                                                                                                                               
#endif  

что здесь непонятного?

vvn_black ★★★ ()
Ответ на: комментарий от MozBd

Вопрос непонятен.

обращение к сторонним генераторам

Каким?

оставить только один

Какой?

Для каждой платформы и так используется свой способ получить «случайное» число.

vvn_black ★★★ ()
Ответ на: комментарий от vvn_black

ДД

во-первых самому интересно, хотя я не программист,

во-вторых есть интересные замыслы,

научи - расскажу, главное - чтобы заработало, потому как пока не работает

MozBd ()
Ответ на: комментарий от MozBd

Разработчик ничего не закладывает, как думаешь, почему число называется псевдослучайное? ) И оно не может быть меньше или больше, можно поменять только распределение получаемых чисел.

Ну или как-то так https://xkcd.com/221/

Теоретически можно поменять логику GenerateRandomSeed() в jsmath.cpp и собрать браузер с «неправильной» рулеткой.

vvn_black ★★★ ()
Последнее исправление: vvn_black (всего исправлений: 1)