Генерация «трафки™» или распределение по весам

Дима Смирнов применил интересное решение для генерации «трафок» на «Блоговаре»:

$rb   = str_pad (decbin (mt_rand (0,64)),6,"0", STR_PAD_LEFT);
$herb = (int) strpos ($rb, "1");

Смысл в том, что каждое следующее значение должно выпадать с вдвое меньшей вероятностью, чем предыдущее. Пока я спал, мне пришло в голову довольно забавное решение на ту же тему. Оно быстрее примерно на 30%, не обладает ограничением на размер и точнее вычисляет вероятности (у Димы «трафка» не выпадает с вероятностью примерно 52%), но не решает задачу полностью. Кто скажет в чём разница, не запуская код?

for ($i = 5; $i && mt_rand(0, 1); --$i);

10 комментариев

«Опера» ищут траву или «мне это подкинули»

Давайте я вам всю мощь «Оперы» (последней) покажу? А то тут некоторые товарищи user.js для обнаружения «трафки™» начали придумывать. Тем не менее, JavaScript тут не нужен, хватит и CSS. Ведь у «Оперы», наряду с пользовательскими JavaScript, есть и пользовательские CSS. Так что, просто подключаем к «Опере» следующий код и следим за индикатором в левом верхнем углу экрана (рассказывать как подключать я не буду и другим не советую — пусть это будет фильтром).

a[href*="blogowar.ru/soldier"]  img[src*="blogowar.ru/herbs"]
{
        position: fixed; top: 4px; left: 4px; z-index:5000;
        background-image: url(http://blogowar.ru/favicon.ico);
        background-position: 50%;
        background-repeat: no-repeat;
        background-color: #eee;
        display: block;
        width: 25px; height: 25px;
}

2 комментария

Склонный к полноте друг поддержит в трудный год

Очень притча понравилась, правдивая:

Голодные волки встретили в лесу зайца и собрались его съесть, а заяц им говорит:
— Погодите, мной вы сильно не насытитесь, а я могу вас привести к стаду овец
Волки решили не есть зайца и пошли за ним. Идут, а голод мучает все сильнее, они значит спрашивают:
— Долго еще идти?
Заяц им отвечает:
— Вот, сразу за горой, которая перед нами
Начали подниматься на гору, но не совладали волки с голодом, набросились на зайцаи съели. Наестца не наелись, голод мучает, но соблазна перед глазами более нет.
Поднялись на гору и видят стадо овец.
Сытно отобедали, и тут один значит говорит:
— Как-то нехорошо с зайцем получилось
Другой:
— Да уж, пойдемте, останки что ли захороним?
Вернулись, похоронили зайца, поставили камень на могилку и думают, что же написать:
— «Другу зайцу» — не пойдет, не поймут, зачем друзья его съели
— «Врагу зайцу» — тоже не пойдет, какой же он враг, когда привел их к стаду овец
Думали, думали, и написали — «нашему консультанту и партнёру — зайцу»

2 комментария

ECMAScript 4 people

В ECMAScript 4 (JavaScript2 будет основан на этом языке) наконец-то появилась поддержка decimal — специального типа для работы с числами с фиксированным количеством десятичных знаков после запятой. В частности, это облегчит работу с денежными операциями.

Проблематику все понимают? Если нет, то хотя бы попробуйте сложить 0.1 и 0.7, умножить сумму на десять и округлить вниз в любом языке, который поддерживает числа с плавающей точкой. В языке, где числа с плавающей точкой представляются в соответствии со стандартом IEEE 754 (что у вас есть под рукой? JavaScript, Perl, PHP, MySQL) вы получите число 7. Почему так происходит — тема отдельного разговора, вкратце — дело в представлении числа с плавающей точкой на машинном уровне (на самом деле результатом данной суммы, в данном случае, с точки зрения такой реализации, будет 0.7999999999999999, а не 0.8) .

Decimal — специальный тип (чаще всего можно встретить его в СУБД), который позволяет манипулировать числами с фиксированной точкой. Зафиксировав точку, можно перейти к такому хранению числа, где таких погрешностей не будет.

В EMCAScript 4 (а так же в языках, на нём основанных — ActionScript 3 и JavaScript 2) есть два способа объявить число как decimal:

{
  use decimal;
  
  var a = 0.1;    //  a — decimal
  var b = 0.2;    //  b — decimal
  var c = a + b;  //  c — decimal (0.3)
}

var a = 0.1m;   //  a — decimal
var b = 0.2m;   //  b — decimal
var c = a + b;  //  c == 0.3m

Суффикс «m» пришёл из «C#» и расшифровывается как «money» («деньги»). В остальных языках программирования проблему обходят, работая с целыми числами. Перед выводом их просто делят на 100.

2 комментария