<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; AHK: Рандомизация значений параметров команд]]></title>
		<link>http://forum.script-coding.com/viewtopic.php?id=10668</link>
		<atom:link href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=10668&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «AHK: Рандомизация значений параметров команд».]]></description>
		<lastBuildDate>Wed, 17 Jun 2015 23:07:35 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: AHK: Рандомизация значений параметров команд]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=94600#p94600</link>
			<description><![CDATA[<p>Что и требовалось доказать - для пользователя лучше как проще (понять), а не как лучше. ))<br />Если уж и этот &quot;наиболее понятный новичку&quot; код копнуть, то не выглядит ли лишней двойная проверка?<br /></p><div class="codebox"><pre><code>else if (rand &gt;= 0.2 &amp;&amp; rand &lt; 0.5)</code></pre></div><p>Левая граница каждого интервала и так проверяется в предыдущем <em>if</em>.<br />Заодно и от абсолютных значений границ интервалов можно избавиться и для этого случая, как и для уже предложенных ранее.<br />Пример для 5 точек, с распределением 10 - 40 - 30 - 2.5 - 17.5 %<br /></p><div class="codebox"><pre><code>points := [ [200, 100], [300, 400], [500, 600] ] ; добавить для 4 и 5 точек
Random, rand, 0.0, 1.0

if      (rand &lt; t:= 0.1)
   i := 1
else if (rand &lt; t+= 0.4)
   i := 2
else if (rand &lt; t+= 0.3)
   i := 3
else if (rand &lt; t+= 0.025)
   i := 4
else
   i := 5

point := points[i]
; CoordMode, Mouse, Screen  ; раскомментировать, если координаты относительно экрана
MouseClick, R, point[1], point[2], 1, 100</code></pre></div><p>Проверка:<br /></p><div class="codebox"><pre><code>SetBatchLines -1
Arr := [0,0,0,0,0]
loop 100000 {
Random, rand, 0.0, 1.0

if      (rand &lt; t:= 0.1)
   Arr[1]++
else if (rand &lt; t+= 0.4)
   Arr[2]++
else if (rand &lt; t+= 0.3)
   Arr[3]++
else if (rand &lt; t+= 0.025)
   Arr[4]++
else
   Arr[5]++
}
MsgBox % Arr[1] &quot;  &quot; Arr[2] &quot;  &quot; Arr[3] &quot;  &quot; Arr[4] &quot;  &quot; Arr[5]</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Irbis)]]></author>
			<pubDate>Wed, 17 Jun 2015 23:07:35 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=94600#p94600</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Рандомизация значений параметров команд]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=94599#p94599</link>
			<description><![CDATA[<p>Ну так разве как новичку обязательно знать как это работает, чтобы этим пользоватся?<br />Я вот например не изучал исходный код виндовс перед использованием. <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /></p><div class="codebox"><pre><code>points := {[200, 100]: 20, [300, 400]: 30, [500, 600]: 50} ; изменять только здесь, остальное не трогать.

for k, v in points, sum := 0
   sum += v 

1:: ; запуск подпрограммы
    Random, rand, , 1.
    for point, v in points, prev := 0
        prev += v/sum
    until rand &lt;= prev  
    ; CoordMode, Mouse, Screen  ; раскомментировать, если координаты относительно экрана
    MouseClick, R, point[1], point[2], 1, 100
    Return</code></pre></div><p>Вот всё что нужно, чтобы добавить ещё одни координаты.<br /></p><div class="codebox"><pre><code>points := {[50, 50]: 10, [200, 100]: 20, [300, 400]: 30, [500, 600]: 40}</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (serzh82saratov)]]></author>
			<pubDate>Wed, 17 Jun 2015 22:22:45 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=94599#p94599</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Рандомизация значений параметров команд]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=94598#p94598</link>
			<description><![CDATA[<p>Для меня, как для начинающего, более всего понятен код:<br /></p><div class="codebox"><pre><code>points := [ [200, 100], [300, 400], [500, 600] ]
Random, rand, 0.0, 1.0

if (rand &lt; 0.2)
   i := 1
else if (rand &gt;= 0.2 &amp;&amp; rand &lt; 0.5)
   i := 2
else
   i := 3

point := points[i]
; CoordMode, Mouse, Screen  ; раскомментировать, если координаты относительно экрана
MouseClick, R, point[1], point[2], 1, 100</code></pre></div><p>Даже сварганил для четырёх и пяти точек ^_^.&nbsp; Всем спасибо господа.</p>]]></description>
			<author><![CDATA[null@example.com (panamaboot)]]></author>
			<pubDate>Wed, 17 Jun 2015 21:43:24 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=94598#p94598</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Рандомизация значений параметров команд]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=94590#p94590</link>
			<description><![CDATA[<p>Я просто хотел показать, что вариант с диапазонами ничем не хуже других. Точнее, все наши варианты, если их достаточно сократить, становятся похожими друг на друга. И даже твой первый вариант по сути &quot;недосокращённый&quot; алгоритм Уолкера.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Wed, 17 Jun 2015 18:56:02 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=94590#p94590</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Рандомизация значений параметров команд]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=94589#p94589</link>
			<description><![CDATA[<p>Ну ты хватил на миллион, на тысячу в большинстве случаев как раз 0,5 процента погрешность.<br /></p><div class="quotebox"><blockquote><p>Почему? Создание и проверку диапазонов значений можно ведь автоматизировать, причём в одном и том же цикле:</p></blockquote></div><p>Собственно и спорить уже не о чем, вариант с процентами в массиве удобен и понятен, с портянкой условий был не айс.</p>]]></description>
			<author><![CDATA[null@example.com (serzh82saratov)]]></author>
			<pubDate>Wed, 17 Jun 2015 18:48:35 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=94589#p94589</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Рандомизация значений параметров команд]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=94588#p94588</link>
			<description><![CDATA[<p>Не совсем понял, почему без возможности повторов.<br /></p><div class="codebox"><pre><code>SetBatchLines, -1
obj := {A: 1.5, B: 97, C: 1.5}

for k, v in obj, sum := 0
   sum += v

test := {A: 0, B: 0, C: 0}
Loop % N := 10**6  {
   Random, rand,, 1.
   for k, v in obj, prev := 0
      prev += v/sum
   until rand &lt;= prev &amp;&amp; test[k]++
}
   
MsgBox, % &quot;A — &quot; Round(test.A/N*100, 1) &quot;%`nB — &quot; Round(test.B/N*100, 1) &quot;%`nC — &quot; Round(test.C/N*100, 1) &quot;%&quot;</code></pre></div><p>(Займёт какое-то время на выполнение.)</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Wed, 17 Jun 2015 18:34:29 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=94588#p94588</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Рандомизация значений параметров команд]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=94587#p94587</link>
			<description><![CDATA[<p>Ну по теме на вряд ли это требуется, если уже и диапазоны в 5% предлагаются. Ну а так или 15 из 1000, или 2 вариант. Но учитывая что теоретически Random из 5 может 5 пятёрок выдать, 3 из 5 я сам видел, то 0,5 процента просто ни на что не повлияет. Для такой точности есть алгоритм без возможности повтора вариантов в диапазоне.</p>]]></description>
			<author><![CDATA[null@example.com (serzh82saratov)]]></author>
			<pubDate>Wed, 17 Jun 2015 18:29:39 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=94587#p94587</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Рандомизация значений параметров команд]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=94565#p94565</link>
			<description><![CDATA[<div class="quotebox"><cite>serzh82saratov пишет:</cite><blockquote><p>Создание строки условий для например 50 координат, и в будущем правка пары значений, то есть поиск где в массиве 22 и 39 ключ, и где их соответствие в строке условий, будет непростым.</p></blockquote></div><p>Почему? Создание и проверку диапазонов значений можно ведь автоматизировать, причём в одном и том же цикле:<br /></p><div class="codebox"><pre><code>obj := {A: 2, B: 3, C: 5}

for k, v in obj, sum := 0
   sum += v

Random, rand,, 1.
for k, v in obj, prev := 0
    prev += v/sum   ; создаём диапазон для каждого ключа
until rand &lt;= prev  ; и сразу проверяем, не попал ли rand в него
   
MsgBox, % k</code></pre></div><p>Можно заметить, что этот вариант практически идентичен вышеприведённому алгоритму:<br /></p><div class="codebox"><pre><code>obj := {A: 2, B: 3, C: 5}
for k, v in obj, _sum := 0
   _sum += v

Random, peek, 1, _sum
for k, v in obj, sum := 0
   sum += v
until sum &gt;= peek

MsgBox, % k</code></pre></div><p>Проверяем правильность алгоритма:<br /></p><div class="codebox"><pre><code>obj := {A: 2, B: 3, C: 5}

for k, v in obj, sum := 0
   sum += v

test := {A: 0, B: 0, C: 0}
Loop % N := 10000  {
   Random, rand,, 1.
   for k, v in obj, prev := 0
      prev += v/sum
   until rand &lt;= prev &amp;&amp; test[k]++
}
   
MsgBox, % &quot;A — &quot; Round(test.A/N*100, 1) &quot;%`nB — &quot; Round(test.B/N*100, 1) &quot;%`nC — &quot; Round(test.C/N*100, 1) &quot;%&quot;</code></pre></div><p>А теперь тебе вопрос на засыпку. Как с помощью твоего производительного способа можно рассчитать вероятность равную 1.5% ?</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Wed, 17 Jun 2015 13:25:14 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=94565#p94565</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Рандомизация значений параметров команд]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=94559#p94559</link>
			<description><![CDATA[<div class="quotebox"><cite>teadrinker пишет:</cite><blockquote><p>Если не читал — молодец. <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /></p></blockquote></div><p>Тоже не читал, но хотел предложить подобный вариант. )) Правда, в нем было запланировано лишнее действие по нормализации суммы вероятностей - приведении к 100%, чтобы выбирать координату на основе случайного числа в интервале 1...100. Ваш вариант с числом от 1 до sum лучше.<br /></p><div class="quotebox"><cite>teadrinker пишет:</cite><blockquote><p>Почему производительнее — не понимаю, там ведь лишнее действие</p></blockquote></div><p>Массив один раз строится (предвычисление), а затем скорость получения n-го элемента не зависит от n.<br />В случае с <em>for</em> для n-ного элемента цикл совершит n итераций. Хотя в случае с небольшим количеством это роли не играет. Да и воoбще, как уже было сказано не раз, в списке причин для использовония autohotkey производительность находится далеко не в самом верху.</p>]]></description>
			<author><![CDATA[null@example.com (Irbis)]]></author>
			<pubDate>Wed, 17 Jun 2015 09:45:19 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=94559#p94559</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Рандомизация значений параметров команд]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=94555#p94555</link>
			<description><![CDATA[<div class="quotebox"><blockquote><p>Этого не нужно.</p></blockquote></div><p>А, ну да, ещё лучше.<br /></p><div class="quotebox"><blockquote><p>Почему производительнее — не понимаю, там ведь лишнее действие.</p></blockquote></div><p>Для получения результата требуется только извлечение из массива, никаких сравнений и переборов. <br />А какое лишнее действие?<br /></p><div class="quotebox"><blockquote><p>Звучит не очень просто. В моём варианте ничего дополнительно создавать не нужно.</p></blockquote></div><p>Создание строки условий для например 50 координат, и в будущем правка пары значений, то есть поиск где в массиве 22 и 39 ключ, и где их соответствие в строке условий, будет непростым. Ну а новичкам ведь всё равно как работает, и если он тот самый 1 из 1000, думаю объяснить это будет проще, чем Walker&#039;s Alias Method.</p>]]></description>
			<author><![CDATA[null@example.com (serzh82saratov)]]></author>
			<pubDate>Wed, 17 Jun 2015 08:19:04 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=94555#p94555</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Рандомизация значений параметров команд]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=94551#p94551</link>
			<description><![CDATA[<p>Если не читал — молодец. <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /><br /></p><div class="quotebox"><blockquote><p>Тут пары в массиве надо располагать по мере возрастания процентов.</p></blockquote></div><p> Этого не нужно.</p><div class="quotebox"><blockquote><p>удобнее и производительнее</p></blockquote></div><p> Почему производительнее — не понимаю, там ведь лишнее действие.</p><div class="quotebox"><blockquote><p>1 вариант тоже очень прост, создаётся &quot;список&quot; с одинаковыми &quot;строками&quot;, количество которых равно количеству вариантов.</p></blockquote></div><p> Звучит не очень просто. В моём варианте ничего дополнительно создавать не нужно.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Wed, 17 Jun 2015 04:28:28 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=94551#p94551</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Рандомизация значений параметров команд]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=94549#p94549</link>
			<description><![CDATA[<div class="quotebox"><blockquote><p>я тоже прочитал</p></blockquote></div><p>Честно говоря, я не читал. </p><p>Немного подправил #21, если процент будет значением в массиве, ещё нагляднее.</p><p>Считаю что в #21, 1 вариант без этого алгоритма, для работы с заранее известными вероятностями, удобнее и производительнее.<br /></p><div class="quotebox"><blockquote><p>зато проще для понимания.</p></blockquote></div><p>1 вариант тоже очень прост, создаётся &quot;список&quot; с одинаковыми &quot;строками&quot;, количество которых равно количеству вариантов. Далее просто выбирается строка по случайному индексу.</p>]]></description>
			<author><![CDATA[null@example.com (serzh82saratov)]]></author>
			<pubDate>Wed, 17 Jun 2015 03:15:35 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=94549#p94549</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Рандомизация значений параметров команд]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=94547#p94547</link>
			<description><![CDATA[<p><strong>serzh82saratov</strong>, я тоже прочитал про этот алгоритм — <a href="https://en.wikipedia.org/wiki/Alias_method">1</a>, <a href="http://www.math.spbu.ru/ru/Archive/Courses/jvr/DA_html/_lec_1_07.html">2</a>, <a href="http://www.codedisqus.com/0NxVgWWWUP/weighted-random-selection-using-walkers-alias-method.html">3</a>.<br /></p><div class="codebox"><pre><code>obj := {A: 20, B: 30, C: 50}
Random, peek, 1, 100
for k, v in obj, sum := 0
   sum += v
until sum &gt;= peek
MsgBox, % k</code></pre></div><p>В общем случае:<br /></p><div class="codebox"><pre><code>obj := {A: 2, B: 3, C: 5}
for k, v in obj, _sum := 0
   _sum += v

Random, peek, 1, _sum
for k, v in obj, sum := 0
   sum += v
until sum &gt;= peek

MsgBox, % k</code></pre></div><p>Проверка:<br /></p><div class="codebox"><pre><code>obj := {A: 2, B: 3, C: 5}
for k, v in obj, _sum := 0
   _sum += v

test := {A: 0, B: 0, C: 0}
Loop 10000  {
   Random, peek, 1, _sum
   for k, v in obj, sum := 0
      sum += v
   until sum &gt;= peek &amp;&amp; test[k]++
}

MsgBox, % test.A &quot;`n&quot; test.B &quot;`n&quot; test.C</code></pre></div><p>Что же касается моего варианта, то он тоже вполне имеет право на существование, он хоть и менее нагляден, зато проще для понимания.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Tue, 16 Jun 2015 23:34:54 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=94547#p94547</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Рандомизация значений параметров команд]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=94533#p94533</link>
			<description><![CDATA[<p>Чуть позже напишу вариант, чтобы было скучно. <img src="//forum.script-coding.com/img/smilies/big_smile.png" width="15" height="15" /></p>]]></description>
			<author><![CDATA[null@example.com (Irbis)]]></author>
			<pubDate>Tue, 16 Jun 2015 18:01:10 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=94533#p94533</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Рандомизация значений параметров команд]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=94531#p94531</link>
			<description><![CDATA[<p>Да, не сообразил, но за-то при изменениях вероятностей будет всегда не скучно.</p>]]></description>
			<author><![CDATA[null@example.com (serzh82saratov)]]></author>
			<pubDate>Tue, 16 Jun 2015 16:42:14 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=94531#p94531</guid>
		</item>
	</channel>
</rss>
