<small id='EiwKRor5Q'></small> <noframes id='78NuB3W'>

  • <tfoot id='kCqNR'></tfoot>

      <legend id='g83MGfDt2'><style id='wa6fv8'><dir id='w3zopX5U0'><q id='fM6I'></q></dir></style></legend>
      <i id='ES8LrWbZw'><tr id='skP3Ol'><dt id='K5mJ0F'><q id='HPAYtZBgF'><span id='Spwjx'><b id='KZ5xek'><form id='04xeWdQ'><ins id='TYHh'></ins><ul id='0dN8DRgu'></ul><sub id='LtxjGXD'></sub></form><legend id='mueBy3vSh'></legend><bdo id='D7ws'><pre id='DzyvOpT'><center id='8WPyV0rvg'></center></pre></bdo></b><th id='MClaK2G'></th></span></q></dt></tr></i><div id='DlavXV1JRW'><tfoot id='ZdUpuq'></tfoot><dl id='NsOamkChxc'><fieldset id='wTnOpS'></fieldset></dl></div>

          <bdo id='uetmxMRPvn'></bdo><ul id='Bp9VZNn'></ul>

          1. <li id='DOMwS6s'></li>
            登陆

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

            admin 2019-07-07 312人围观 ,发现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