<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; AHK: Рандомизация значений параметров команд]]></title>
	<link rel="self" href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=10668&amp;type=atom" />
	<updated>2015-06-17T23:07:35Z</updated>
	<generator>PunBB</generator>
	<id>http://forum.script-coding.com/viewtopic.php?id=10668</id>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Рандомизация значений параметров команд]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=94600#p94600" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[Irbis]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=27384</uri>
			</author>
			<updated>2015-06-17T23:07:35Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=94600#p94600</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Рандомизация значений параметров команд]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=94599#p94599" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[serzh82saratov]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=27879</uri>
			</author>
			<updated>2015-06-17T22:22:45Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=94599#p94599</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Рандомизация значений параметров команд]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=94598#p94598" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[panamaboot]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=27546</uri>
			</author>
			<updated>2015-06-17T21:43:24Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=94598#p94598</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Рандомизация значений параметров команд]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=94590#p94590" />
			<content type="html"><![CDATA[<p>Я просто хотел показать, что вариант с диапазонами ничем не хуже других. Точнее, все наши варианты, если их достаточно сократить, становятся похожими друг на друга. И даже твой первый вариант по сути &quot;недосокращённый&quot; алгоритм Уолкера.</p>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2015-06-17T18:56:02Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=94590#p94590</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Рандомизация значений параметров команд]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=94589#p94589" />
			<content type="html"><![CDATA[<p>Ну ты хватил на миллион, на тысячу в большинстве случаев как раз 0,5 процента погрешность.<br /></p><div class="quotebox"><blockquote><p>Почему? Создание и проверку диапазонов значений можно ведь автоматизировать, причём в одном и том же цикле:</p></blockquote></div><p>Собственно и спорить уже не о чем, вариант с процентами в массиве удобен и понятен, с портянкой условий был не айс.</p>]]></content>
			<author>
				<name><![CDATA[serzh82saratov]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=27879</uri>
			</author>
			<updated>2015-06-17T18:48:35Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=94589#p94589</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Рандомизация значений параметров команд]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=94588#p94588" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2015-06-17T18:34:29Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=94588#p94588</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Рандомизация значений параметров команд]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=94587#p94587" />
			<content type="html"><![CDATA[<p>Ну по теме на вряд ли это требуется, если уже и диапазоны в 5% предлагаются. Ну а так или 15 из 1000, или 2 вариант. Но учитывая что теоретически Random из 5 может 5 пятёрок выдать, 3 из 5 я сам видел, то 0,5 процента просто ни на что не повлияет. Для такой точности есть алгоритм без возможности повтора вариантов в диапазоне.</p>]]></content>
			<author>
				<name><![CDATA[serzh82saratov]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=27879</uri>
			</author>
			<updated>2015-06-17T18:29:39Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=94587#p94587</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Рандомизация значений параметров команд]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=94565#p94565" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2015-06-17T13:25:14Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=94565#p94565</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Рандомизация значений параметров команд]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=94559#p94559" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[Irbis]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=27384</uri>
			</author>
			<updated>2015-06-17T09:45:19Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=94559#p94559</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Рандомизация значений параметров команд]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=94555#p94555" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[serzh82saratov]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=27879</uri>
			</author>
			<updated>2015-06-17T08:19:04Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=94555#p94555</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Рандомизация значений параметров команд]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=94551#p94551" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2015-06-17T04:28:28Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=94551#p94551</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Рандомизация значений параметров команд]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=94549#p94549" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[serzh82saratov]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=27879</uri>
			</author>
			<updated>2015-06-17T03:15:35Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=94549#p94549</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Рандомизация значений параметров команд]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=94547#p94547" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2015-06-16T23:34:54Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=94547#p94547</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Рандомизация значений параметров команд]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=94533#p94533" />
			<content type="html"><![CDATA[<p>Чуть позже напишу вариант, чтобы было скучно. <img src="//forum.script-coding.com/img/smilies/big_smile.png" width="15" height="15" /></p>]]></content>
			<author>
				<name><![CDATA[Irbis]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=27384</uri>
			</author>
			<updated>2015-06-16T18:01:10Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=94533#p94533</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Рандомизация значений параметров команд]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=94531#p94531" />
			<content type="html"><![CDATA[<p>Да, не сообразил, но за-то при изменениях вероятностей будет всегда не скучно.</p>]]></content>
			<author>
				<name><![CDATA[serzh82saratov]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=27879</uri>
			</author>
			<updated>2015-06-16T16:42:14Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=94531#p94531</id>
		</entry>
</feed>
