<?xml version="1.0" encoding="UTF-8"?><!-- generator="wordpress/2.0.6" -->
<rss version="2.0" 
	xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
	<title>Комментарии на запись: Частотный (весовой) коэффициент или выбор случайного числа с учетом веса</title>
	<link>http://turenko.com/blog/2008/06/25/chastotnyiy-vesovoy-koeffitsient-ili-vyibor-sluchaynogo-chisla-s-uchetom-vesa/</link>
	<description>Михаил Туренко (Тюмень). Личный блог</description>
	<pubDate>Mon, 21 May 2012 23:04:01 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.0.6</generator>

	<item>
		<title>от: Сергей febb</title>
		<link>http://turenko.com/blog/2008/06/25/chastotnyiy-vesovoy-koeffitsient-ili-vyibor-sluchaynogo-chisla-s-uchetom-vesa/#comment-24343</link>
		<pubDate>Thu, 26 Jun 2008 04:13:21 +0000</pubDate>
		<guid>http://turenko.com/blog/2008/06/25/chastotnyiy-vesovoy-koeffitsient-ili-vyibor-sluchaynogo-chisla-s-uchetom-vesa/#comment-24343</guid>
					<description>Заинтересовала задача :) Первый способ там неправильный. Чтобы найти правильный ответ, нужно знать сумму всех весов. Также получать сначала сумму, а потом еще раз проходить массив - неэффективно. Также неэффективно несколько раз получать RND - нафиг это надо вообще. Решение на мой взгляд такое. Задача решается двумя циклами, каждый из которых проходится только один раз. Опишу наглядно, так как подзабыл синтаксис перла уже давно.

Чтобы лучше понять, можно представить список в виде лунок, ширина каждой равна весовому коэффициенту. Ставим лунки последовательно и кидаем шарик :-) Получается рулетка с лунками неодинаковой ширины :-)

Функция (заводим массив чисел, возвращаем порядковый номер числа)

1-й цикл.

Имеем массив 1 1 3 4 1 5.
Заместо них, чтобы не тратить память, в массив циклом суммируем число с предыдущим, то есть заводим вместо него
1 2 5 9 10 15.
тут же с каждой итерацией считаем сумму , прибавляя каждый новый член, получаем SUM = 42. Сумму сразу, как в примерах, считать неэффективно.

После первого цикла вычисляем RND * SUM, допустим получили 0.4 * 14 = 5,6

2-й цикл.

вариант а) Простейший. Начинаем сравнивать полученную RND * SUM со значением в каждой лунке. 
1) 5,6 </description>
		<content:encoded><![CDATA[<p>Заинтересовала задача <img src='http://turenko.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Первый способ там неправильный. Чтобы найти правильный ответ, нужно знать сумму всех весов. Также получать сначала сумму, а потом еще раз проходить массив - неэффективно. Также неэффективно несколько раз получать RND - нафиг это надо вообще. Решение на мой взгляд такое. Задача решается двумя циклами, каждый из которых проходится только один раз. Опишу наглядно, так как подзабыл синтаксис перла уже давно.</p>
<p>Чтобы лучше понять, можно представить список в виде лунок, ширина каждой равна весовому коэффициенту. Ставим лунки последовательно и кидаем шарик <img src='http://turenko.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  Получается рулетка с лунками неодинаковой ширины <img src='http://turenko.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Функция (заводим массив чисел, возвращаем порядковый номер числа)</p>
<p>1-й цикл.</p>
<p>Имеем массив 1 1 3 4 1 5.<br />
Заместо них, чтобы не тратить память, в массив циклом суммируем число с предыдущим, то есть заводим вместо него<br />
1 2 5 9 10 15.<br />
тут же с каждой итерацией считаем сумму , прибавляя каждый новый член, получаем SUM = 42. Сумму сразу, как в примерах, считать неэффективно.</p>
<p>После первого цикла вычисляем RND * SUM, допустим получили 0.4 * 14 = 5,6</p>
<p>2-й цикл.</p>
<p>вариант а) Простейший. Начинаем сравнивать полученную RND * SUM со значением в каждой лунке.<br />
1) 5,6
</p>
]]></content:encoded>
				</item>
</channel>
</rss>

