LINUX.ORG.RU
ФорумTalks

Задачка для разминки

 


0

1

Сижу ковыряю js. Если честно, мне с лихвой хватало vb, но на новой работе мак, поэтому возникла необходимость.

Значит, есть всемирно-известная фирма, продукцией которой я пользуюсь. В ихних мануалах по js я дважды наткнулся на такую строку: Math.round (Math.Random()... И в связи с этим вспомнил древнюю книжку для школьников, по которой (уже во взрослом возрасте) учил vb. И вот хочу процитировать оттуда задачку:

Для того чтобы получить случайное значение N из интервала от N1 до N2 (N, N1, N2 — целые числа), можно поступить следующим образом: N=N1+Int(Rnd*(N2-N1+1)). Напомним, что функция Int не округляет своего аргумента. Например, Int(0.05)=0; Int(4.95)=4. Как вы думаете, почему для создания случайного целого числа в интервале от N1 до N2 некорректным будет такой способ: N=N1+CInt(Rnd*(N2-N1))? Функция CInt округляет значение своего аргумента (Int(0.05)=0; Int(4.95)=5). Вопрос трудный!

Я сразу вспомнил этот трудный вопрос. Сижу и думаю, надо же — интеллектуально оболваненные бейсиком школьники в доинтернетовскую эпоху (книжка 98 года) сидели и пухли над какими-то тонкостями в алгоритмах. А ч0ткие пацаны в корпорациях ставят Round и не парятся. ))

Сижу ковыряю js.

Ты кажись перепердолился, и у тебя крыша едет.

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

Подставь минимальное и максимальное случайные значения в формулу и посмотри попадают они в заявленный диапазон.

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

Я задачку давно решил. Значения в диапазон попадают в обоих случаях. Ошибок нет. Речь про некорректность. В этом суть вопроса.

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

Не знаю. Возможно. Во всяком случае результату оно подгадит.

Ну как не знаю. По моему это очевидно. Вот у нас масштабированный Rnd*10 возвращает float от 0 до 10 с uniform distribution. Надо его разделить на равные регионы и связать каждый регион с целым результатом от 0 до 10. Если просто отбрасывать дробную часть, то регионы будут одного размера, если окргулять, то всё например от 0 до 0.4(9) попадёт в регион 0, а всё от 0.5 до 1.4(9) попадёт в регион 1, и эти два региона уже будут разными по размеру -> разломали uniform distribution.

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

Потому, что:


  • Строго математическое округление может выйти за границу.
  • Может нарушиться равномерность распределения.
watashinoshi ()
Ответ на: комментарий от watashinoshi

1. Может, но не в данном случае (согласно официальной документации js)

2. Ага. Именно оно.

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

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

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

и появилась возможность поумничать

Сильно скромничать в нашей жизни нельзя. Затопчут.

Ну тогда сгенери случайные числа и проверь что они случайные.

Ничего я генерить не буду. Правильные ответы даны и подробно расписаны.

rechnick ★★ ()

Если честно, мне с лихвой хватало vb, но на новой работе мак, поэтому возникла необходимость.

А какие вещества были на предыдущем месте работы?

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

Сильно умничать тоже, еще больше топчут. Правильные ответы в твоем понимании, в меру твоей испорченности. В том же 98-м существовала function random (range: integer). 2017. Программисты js рассказывают как правильно получит случайные числа, бросаясь «uniform distribution», походу ввиду отсутствия русских слов по этому поводу. Прогресс просто радует.

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

Это просто проверить школьными методами =)

x = 0.4(9)
10x = 4.9(9)
10x - x = 9x = 4.9(9) - 0.4(9) = 4.5
x = 4.5 / 9 = 0.5

P.S. Никакого подвоха нет, это просто особенность записи числа при помощи цифр.

aquadon ★★★★★ ()
Последнее исправление: aquadon (всего исправлений: 1)
Ответ на: комментарий от aquadon

И правда. А я там кажется что-то более другое имел в виду (полуоткрытый отрезок).

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

Это называется занудство, ибо ты и сам не напишешь грамотно это дискретное множество float чисел попадающих в тот интервал.

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

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

дискретное множество float чисел попадающих в тот интервал

О каком интервале идёт речь сейчас. Float - это, само собой, рациональные числа, ибо количество цифр ограничено. Но не вижу противоречий с тем, что я написал.

aquadon ★★★★★ ()
Последнее исправление: aquadon (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.