- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我知道F-Y和reservoir sampling都可以实现shuffle array。比如我们在一个m * n的扫雷板上部署k个炸弹。
我已经完成了示例代码:
public int[][] init2(int width, int length, int num){
int[][] board = int[width][length];
int[] bomb = new int[num];
for(int i =0; i<num; i++){
bomb[i] = i;
}
Random rand = new Random();
for(int i = num; i<width*length; i++){
int pos = rand.nextInt(i);
if(pos < num){
bomb[pos] = i;
}
}
// TO DO
// and then restore the pos to board
}
// Fisher–Yates shuffle
public int[][] init3(int width, int length, int num){
int[][] board = int[width][length];
for(int i =0; i<num; i++){
board[i%width][i/width] = 1;
}
Random rand = new Random();
for(int i = num; i<width*length; i++){
int pos = rand.nextInt(i+1);
swap(board, i, pos);
}
}
public void swap(int[][] board, int pos1, int pos2){
int temp = board[pos1%width][pos1/width];
board[pos1%width][pos1/width] = board[pos2%width][pos2/width];
board[pos2%width][pos2/width] = temp;
}
我认为两者背后的数学原理是相同的,但我不知道为什么。顺便说一句,如果我们在stackoverflow上输入代码,我们似乎不需要使用markdown。太棒了!
最佳答案
两者的区别在于它们做的事情不同:
+--------------+----------------+-----------------------------+------+-------+
| ALGORITHM | INPUT(S) | OUTPUT | TIME | SPACE |
+--------------+----------------+-----------------------------+------+-------+
| FISHER-YATES | n elements | A list containing all n | O(n) | O(n) |
| SHUFFLE | | elements in a random order | | |
+--------------+----------------+-----------------------------+------+-------+
| RESERVOIR | n elements and | A set containing k of the n | O(n) | O(k) |
| SAMPLING | an integer k | elements, selected randomly | | |
+--------------+----------------+-----------------------------+------+-------+
对于您的扫雷示例,您有 m × n 个单元格并且想要选择其中的 k 个,这正是水库采样所做的.所以它在概念上似乎更适合我。但是由于您打算使用 O(m × n) 空间无论如何,并且由于您的整个问题可能是没有大到真正担心性能,我认为 Fisher-Yates 方法也很好。 (它们在数学上都是合理的。)
关于algorithm - Fisher-Yates 随机抽样和水库抽样之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47005560/
现在我正在开发一套文字游戏作为自学的一种方式(并重新创建一些我最喜欢的文字游戏!)在一位“真正”学习编程的 friend 的帮助下,我们实现了一个很好的排列方法在我的一门课上。它正在查找 3 个及以上
我是一般编码的新手,现在已经使用 javascript 有一段时间了 - 对于我在发布此问题时可能犯的任何失误,提前致歉。我研究了 2 个小时的大部分时间,无法自己得出答案,所以我在这里注册了一个帐户
我知道F-Y和reservoir sampling都可以实现shuffle array。比如我们在一个m * n的扫雷板上部署k个炸弹。 我已经完成了示例代码: public int[][] init
所以我目前正在使用 Actionscript 3.0 制作问答游戏,我想使用 Fisher-Yates 随机播放算法随机播放问题: 这是我的代码: var questions:Array = [1,2
我并行启动几个依赖于随机数的 C/C++ 程序。对这个话题还算陌生,听说过段时间应该做seed。 此外,我使用 Fisher Yates 算法获得具有唯一随机打乱值的列表。但是,并行启动程序两次会为两
我正在使用标准的 Fisher-Yates 算法随机洗牌数组中的一副牌。但是,我不确定这是否真的会产生真实世界洗牌后所有可能排列的真实分布。 V8 的 Math.random 只有 128 位的内部状
根据维基百科和Java标准库的实现,shuffling https://en.wikipedia.org/wiki/Fisher–Yates_shuffle (Fisher Yates Shuffli
意识到当某些事情看起来好得令人难以置信时,我想我会提出这个问题,希望能清除任何小 Sprite 。我回顾了我能找到的几个相关主题,但我的问题仍然存在。 我对 Haskell 比较陌生,在我的实验中,我
我将洗牌算法实现为: import random a = range(1, n+1) #a containing element from 1 to n for i in range(n):
我将洗牌算法实现为: import random a = range(1, n+1) #a containing element from 1 to n for i in range(n):
我一直在尝试直接对二维数组的前 N 个元素执行部分 fisher-yates 洗牌,但没有成功。我知道我可以将 2D 数组转换为 1D 数组,执行随机播放然后将其转回,但如果可能的话我想避免这种情
你会说现代版的 fisher yates 是最无偏的洗牌算法吗?您如何解释数组中的每个元素都有 1/n 的概率位于其原始位置? 最佳答案 给定一个完美的伪随机数生成器(Mersenne Twister
JS 新手,目前正在大学学习。对于我当前的 JS 项目,我正在构建一个内存卡游戏。我开始思考如何随机洗牌,并且我接近了 Fisher-Yates Shuffle 算法的作用 - this page 上
我正在 exercism.io 中进行练习,其中我必须为机器人生成随机名称。我能够通过大量测试,直到达到此测试: [Fact] public void Robot_names_are_unique()
我正在编写的一些代码遇到了一些问题。基本上,我试图像一副纸牌一样“洗牌”堆栈集合,但由于某种原因,我使用的临时堆栈之一不会完全清空,这会在下次运行时导致空集合异常大约。我手动跟踪了代码和输出,元素被留
假设 Math.random() 生成 0 到 1 之间均匀分布的随机数,这是 Fischer Yates shuffle 的正确实现吗?我正在寻找一个非常随机、均匀的分布,其中可以指定输入数组 (a
所以我尝试利用 Fisher-Yates 算法对数组的元素进行洗牌。然后我想将这个“洗牌”数组插入另一个数组中。我的目标是创建一个包含特定数量的“洗牌”数组的数组。 例如: var myInput =
我正在尝试重现 Fisher-Yates 算法来对数组进行适当的洗牌: ref1: Coding Horror ref2: Eli Bendersky 问题是,当我运行“天真的”洗牌的第一步时,我的结
我一直在问关于随机数的问题,我认为 Fisher-Yates shuffle 是最好的选择。我做了一张 table 't' t = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} 现在,
我正在尝试创建一个控制台程序来模拟有一副纸牌,用户应该能够; 随机抽取一些卡片 洗牌 将牌组恢复到原来的状态 我正在努力想办法让牌组回到起点 当我尝试再次使用初始化数组时; string[] Deck
我是一名优秀的程序员,十分优秀!