<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>StegLog - puzzle</title>
    <link>http://blog.stegnar.com/</link>
    <description>Reflections on Software Development</description>
    <language>en-us</language>
    <copyright>Peter Stegnar</copyright>
    <lastBuildDate>Sun, 03 May 2009 11:21:22 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 2.3.9074.18820</generator>
    <managingEditor>peter@stegnar.com</managingEditor>
    <webMaster>peter@stegnar.com</webMaster>
    <item>
      <trackback:ping>http://blog.stegnar.com/Trackback.aspx?guid=65346523-5050-419b-84b7-d6043a0bb591</trackback:ping>
      <pingback:server>http://blog.stegnar.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.stegnar.com/PermaLink,guid,65346523-5050-419b-84b7-d6043a0bb591.aspx</pingback:target>
      <dc:creator>Peter Stegnar</dc:creator>
      <wfw:comment>http://blog.stegnar.com/CommentView,guid,65346523-5050-419b-84b7-d6043a0bb591.aspx</wfw:comment>
      <wfw:commentRss>http://blog.stegnar.com/SyndicationService.asmx/GetEntryCommentsRss?guid=65346523-5050-419b-84b7-d6043a0bb591</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <div class="post-text">
          <p>
I have played around and I write <a href="http://gist.github.com/105929" rel="nofollow">"testing
environment"</a> for this Rand(7) algorithm. For example if you want to try what distribution
gives your algorithm or how much iterations takes to generate all distinct random
values (for Rand(7) 1-7), you <a href="http://gist.github.com/105929" rel="nofollow">can
use it</a>.
</p>
          <p>
My core algorithm is this:
</p>
          <pre class="prettyprint">
            <code>
              <span class="kwd">return</span>
              <span class="pln">
              </span>
              <span class="pun">(</span>
              <span class="pln">Rand5</span>
              <span class="pun">()</span>
              <span class="pln">
              </span>
              <span class="pun">+</span>
              <span class="pln"> Rand5</span>
              <span class="pun">())</span>
              <span class="pln">
              </span>
              <span class="pun">%</span>
              <span class="pln">
              </span>
              <span class="lit">7</span>
              <span class="pln">
              </span>
              <span class="pun">+</span>
              <span class="pln">
              </span>
              <span class="lit">1</span>
              <span class="pun">;</span>
              <span class="pln">
                <br />
              </span>
            </code>
          </pre>
          <p>
Well is no less uniformly distributed then Adam Rosenfield's one. (<a href="http://gist.github.com/105929" rel="nofollow">which
I included in my snippet code</a>)
</p>
          <pre class="prettyprint">
            <code>
              <span class="kwd">private</span>
              <span class="pln">
              </span>
              <span class="kwd">static</span>
              <span class="pln">
              </span>
              <span class="kwd">int</span>
              <span class="pln"> Rand7WithRand5</span>
              <span class="pun">()</span>
              <span class="pln">
                <br />
              </span>
              <span class="pun">{</span>
              <span class="pln">
                <br />
    </span>
              <span class="com">//PUT YOU FAVOURITE ALGORITHM HERE//</span>
              <span class="pln">
                <br />
                <br />
    </span>
              <span class="com">//1. Stackoverflow winner</span>
              <span class="pln">
                <br />
    </span>
              <span class="kwd">int</span>
              <span class="pln"> i</span>
              <span class="pun">;</span>
              <span class="pln">
                <br />
    </span>
              <span class="kwd">do</span>
              <span class="pln">
                <br />
    </span>
              <span class="pun">{</span>
              <span class="pln">
                <br />
        i </span>
              <span class="pun">=</span>
              <span class="pln">
              </span>
              <span class="lit">5</span>
              <span class="pln">
              </span>
              <span class="pun">*</span>
              <span class="pln">
              </span>
              <span class="pun">(</span>
              <span class="pln">Rand5</span>
              <span class="pun">()</span>
              <span class="pln">
              </span>
              <span class="pun">-</span>
              <span class="pln">
              </span>
              <span class="lit">1</span>
              <span class="pun">)</span>
              <span class="pln">
              </span>
              <span class="pun">+</span>
              <span class="pln"> Rand5</span>
              <span class="pun">();</span>
              <span class="pln">
              </span>
              <span class="com">//
i is now uniformly random between 1 and 25</span>
              <span class="pln">
                <br />
    </span>
              <span class="pun">}</span>
              <span class="pln">
              </span>
              <span class="kwd">while</span>
              <span class="pln">
              </span>
              <span class="pun">(</span>
              <span class="pln">i </span>
              <span class="pun">&gt;</span>
              <span class="pln">
              </span>
              <span class="lit">21</span>
              <span class="pun">);</span>
              <span class="pln">
                <br />
    </span>
              <span class="com">// i is now uniformly random between 1 and
21</span>
              <span class="pln">
                <br />
    </span>
              <span class="kwd">return</span>
              <span class="pln"> i </span>
              <span class="pun">%</span>
              <span class="pln">
              </span>
              <span class="lit">7</span>
              <span class="pln">
              </span>
              <span class="pun">+</span>
              <span class="pln">
              </span>
              <span class="lit">1</span>
              <span class="pun">;</span>
              <span class="pln">
                <br />
                <br />
    </span>
              <span class="com">//My 2 cents</span>
              <span class="pln">
                <br />
    </span>
              <span class="com">//return (Rand5() + Rand5()) % 7 + 1;</span>
              <span class="pln">
                <br />
              </span>
              <span class="pun">}</span>
              <span class="pln">
                <br />
              </span>
            </code>
          </pre>
          <p>
This "testing environment" can take any Rand(n) algorithm and test and evaluate it
(distribution and speed). Just put your code into the "Rand7WithRand5" method and
run the snippet.
</p>
          <p>
Few observations:
</p>
          <ul>
            <li>
Adam Rosenfield's algorithm is no better distributed then, for example, mine. Anyway,
both algorithms distribution is horrible.</li>
            <li>
Native Rand7 (<code>random.Next(1, 8)</code>) is completed as it generated all members
in given interval in around 200+ iterations, Rand7WithRand5 algorithms take order
of 10k (around 30-70k)</li>
            <li>
Real challenge is not to write a method to generate Rand(7) from Rand(5), but it generate
values more or less uniformly distributed.</li>
          </ul>
Discussion on this is on <a href="http://stackoverflow.com/questions/137783/given-a-function-which-produces-a-random-integer-in-the-range-1-to-5-write-a-fun">Stackoverflow</a>.<br /></div>
        <p>
        </p>
        <img width="0" height="0" src="http://blog.stegnar.com/aggbug.ashx?id=65346523-5050-419b-84b7-d6043a0bb591" />
      </body>
      <title>Rand(7) algorithm which is implemented with Rand(5)</title>
      <guid isPermaLink="false">http://blog.stegnar.com/PermaLink,guid,65346523-5050-419b-84b7-d6043a0bb591.aspx</guid>
      <link>http://blog.stegnar.com/2009/05/03/Rand7AlgorithmWhichIsImplementedWithRand5.aspx</link>
      <pubDate>Sun, 03 May 2009 11:21:22 GMT</pubDate>
      <description>&lt;div class="post-text"&gt;
&lt;p&gt;
I have played around and I write &lt;a href="http://gist.github.com/105929" rel="nofollow"&gt;"testing
environment"&lt;/a&gt; for this Rand(7) algorithm. For example if you want to try what distribution
gives your algorithm or how much iterations takes to generate all distinct random
values (for Rand(7) 1-7), you &lt;a href="http://gist.github.com/105929" rel="nofollow"&gt;can
use it&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
My core algorithm is this:
&lt;/p&gt;
&lt;pre class="prettyprint"&gt;&lt;code&gt;&lt;span class="kwd"&gt;return&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="pln"&gt;Rand5&lt;/span&gt;&lt;span class="pun"&gt;()&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;+&lt;/span&gt;&lt;span class="pln"&gt; Rand5&lt;/span&gt;&lt;span class="pun"&gt;())&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;%&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="lit"&gt;7&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;+&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="lit"&gt;1&lt;/span&gt;&lt;span class="pun"&gt;;&lt;/span&gt;&lt;span class="pln"&gt;
&lt;br&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;
Well is no less uniformly distributed then Adam Rosenfield's one. (&lt;a href="http://gist.github.com/105929" rel="nofollow"&gt;which
I included in my snippet code&lt;/a&gt;)
&lt;/p&gt;
&lt;pre class="prettyprint"&gt;&lt;code&gt;&lt;span class="kwd"&gt;private&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="kwd"&gt;static&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="kwd"&gt;int&lt;/span&gt;&lt;span class="pln"&gt; Rand7WithRand5&lt;/span&gt;&lt;span class="pun"&gt;()&lt;/span&gt;&lt;span class="pln"&gt;
&lt;br&gt;
&lt;/span&gt;&lt;span class="pun"&gt;{&lt;/span&gt;&lt;span class="pln"&gt;
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="com"&gt;//PUT YOU FAVOURITE ALGORITHM HERE//&lt;/span&gt;&lt;span class="pln"&gt;
&lt;br&gt;
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="com"&gt;//1. Stackoverflow winner&lt;/span&gt;&lt;span class="pln"&gt;
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="kwd"&gt;int&lt;/span&gt;&lt;span class="pln"&gt; i&lt;/span&gt;&lt;span class="pun"&gt;;&lt;/span&gt;&lt;span class="pln"&gt;
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="kwd"&gt;do&lt;/span&gt;&lt;span class="pln"&gt;
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="pun"&gt;{&lt;/span&gt;&lt;span class="pln"&gt;
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; i &lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="lit"&gt;5&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;*&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="pln"&gt;Rand5&lt;/span&gt;&lt;span class="pun"&gt;()&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;-&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="lit"&gt;1&lt;/span&gt;&lt;span class="pun"&gt;)&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;+&lt;/span&gt;&lt;span class="pln"&gt; Rand5&lt;/span&gt;&lt;span class="pun"&gt;();&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="com"&gt;//
i is now uniformly random between 1 and 25&lt;/span&gt;&lt;span class="pln"&gt;
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="pun"&gt;}&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="kwd"&gt;while&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="pln"&gt;i &lt;/span&gt;&lt;span class="pun"&gt;&amp;gt;&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="lit"&gt;21&lt;/span&gt;&lt;span class="pun"&gt;);&lt;/span&gt;&lt;span class="pln"&gt;
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="com"&gt;// i is now uniformly random between 1 and
21&lt;/span&gt;&lt;span class="pln"&gt;
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="kwd"&gt;return&lt;/span&gt;&lt;span class="pln"&gt; i &lt;/span&gt;&lt;span class="pun"&gt;%&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="lit"&gt;7&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;+&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="lit"&gt;1&lt;/span&gt;&lt;span class="pun"&gt;;&lt;/span&gt;&lt;span class="pln"&gt;
&lt;br&gt;
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="com"&gt;//My 2 cents&lt;/span&gt;&lt;span class="pln"&gt;
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="com"&gt;//return (Rand5() + Rand5()) % 7 + 1;&lt;/span&gt;&lt;span class="pln"&gt;
&lt;br&gt;
&lt;/span&gt;&lt;span class="pun"&gt;}&lt;/span&gt;&lt;span class="pln"&gt;
&lt;br&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;
This "testing environment" can take any Rand(n) algorithm and test and evaluate it
(distribution and speed). Just put your code into the "Rand7WithRand5" method and
run the snippet.
&lt;/p&gt;
&lt;p&gt;
Few observations:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Adam Rosenfield's algorithm is no better distributed then, for example, mine. Anyway,
both algorithms distribution is horrible.&lt;/li&gt;
&lt;li&gt;
Native Rand7 (&lt;code&gt;random.Next(1, 8)&lt;/code&gt;) is completed as it generated all members
in given interval in around 200+ iterations, Rand7WithRand5 algorithms take order
of 10k (around 30-70k)&lt;/li&gt;
&lt;li&gt;
Real challenge is not to write a method to generate Rand(7) from Rand(5), but it generate
values more or less uniformly distributed.&lt;/li&gt;
&lt;/ul&gt;
Discussion on this is on &lt;a href="http://stackoverflow.com/questions/137783/given-a-function-which-produces-a-random-integer-in-the-range-1-to-5-write-a-fun"&gt;Stackoverflow&lt;/a&gt;.&lt;br&gt;
&lt;/div&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.stegnar.com/aggbug.ashx?id=65346523-5050-419b-84b7-d6043a0bb591" /&gt;</description>
      <comments>http://blog.stegnar.com/CommentView,guid,65346523-5050-419b-84b7-d6043a0bb591.aspx</comments>
      <category>puzzle</category>
      <category>random</category>
    </item>
  </channel>
</rss>