<small id='ZWKwtGLlh'></small> <noframes id='W2N1j8lHoA'>

  • <tfoot id='1ViY'></tfoot>

      <legend id='PbS6r'><style id='8bOy1'><dir id='sNovfEDhJl'><q id='wG1pP5H'></q></dir></style></legend>
      <i id='cYeD75q4'><tr id='SU7JZK4'><dt id='k3TU'><q id='EWZ6Mr4C'><span id='4ENtJUG'><b id='73kcYNVg'><form id='Q0DROin'><ins id='WpVlM'></ins><ul id='BCOdfmxhz'></ul><sub id='4SCKO0'></sub></form><legend id='PDYepI'></legend><bdo id='y47c'><pre id='7dMU6B'><center id='QIrb7V2J'></center></pre></bdo></b><th id='HOfj8sSNx'></th></span></q></dt></tr></i><div id='GU80Jb3F'><tfoot id='OEfbd'></tfoot><dl id='uf1yYFKs'><fieldset id='dV2m1Yl'></fieldset></dl></div>

          <bdo id='7ydi3e'></bdo><ul id='rkgcM'></ul>

          1. <li id='9gNu17'></li>
            登陆

            扫雷与算法:怎么随机化的布雷(二)之洗牌算法

            admin 2019-07-07 255人围观 ,发现0个评论

            前语:扫雷与算法:怎么随机化的布雷(一)

            先来考虑一个问题:有一个巨细为 100 的数组,里边的元素是从 1 到 100 扫雷与算法:怎么随机化的布雷(二)之洗牌算法按次序摆放,怎样随机的从里边挑选 1 个数?

            最简略的办法是使用体系的办法 Math.random() * 100 ,这样就可以拿到一个 0 到 99 的随机数,然后去数组找对应的方位就即可。

            接下来在考虑一个问题: 有一个巨细为100的数组,里边的元素是从 1 到 100 按次序摆放,怎样随机的从里边挑选 50 个数?

            留意数字不能重复!

            留意数字不能重复!

            留意数字不能重复!

            假如依据上面的思路,你榜首主意是:随机 50 次不就行了?

            可是,这样做有个很明显的 bug :数字是会重复的。

            修正一下?

            弄一个数组,把每一次随机的数都放到数组里,下一次随机就看这个数组里边有没有这数,有的话就持续随机,直到这个数组里边有 50 个数字就中止。

            这样是可以的!

            但,仍是有个小问题,考虑一下极点状况:有一个巨细为100的数组,里边的元素是从 1 到 100 按次序摆放,怎样随机的从里边挑选 99 个数

            假如依照上面的办法操作,越往后挑选的数字跟前面现已挑选的数字重复的概率越高,这就会形成假如数组很大,挑选的数字数目也很大的话,重复次数在量级上会很大。

            这个时分就需要换一个思路,假如先将数组里边的元素打乱,那么按次序挑选前 50 个不就可以了?

            是的!

            但咱们得留意什么叫乱?

            一副扑克有 54 张牌,有 54! 种摆放方法。所谓的打乱指的是,你所履行的操作,应该可以 等概率地生成 这 54! 种成果中的一种。

            洗牌算法就能做到这一点。

            洗牌算法

            Fisher–Yates shuffle 算法由 Ronald Fisher 和 Frank Yates 于 1938 年提出,在 1964 年由 Richard Durstenfeld 改编为适用于电脑编程的版别。

            这个算法很牛逼却很好了解,浅显的解说便是:将最终一个数和前面恣意 n-1 个数中的一个数进行交流,然后倒数第二个数和前面恣意 n-2 个数中的一个数进行交流。。。


            小程序真心话大冒险经典问题完成代码

            for (var i = this.rowCount * this.colCount - 1; i >= 0 ; i--){
              var iX = parseInt(i / this.colCount);
              var iY = i % this.colCount;

              var randNumber = this.rangeRandom(0, i + 1);

              var randX = parseInt(randNumber / this.colCount);
              var randY = randNumber % this.colCount;

             //交流两个方位
              var temp = tmpMineMap[iX][iY];
              tmpMineMap[iX][iY]&nb扫雷与算法:怎么随机化的布雷(二)之洗牌算法sp;= tmpMineMap[r扫雷与算法:怎么随机化的布雷(二)之洗牌算法andX][randY];
              tmpMineMap[randX][randY] = temp;
            }

            小程序完成作用



            请关注微信公众号
            微信二维码
            不容错过
            Powered By Z-BlogPHP