首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >随机时隙算法

随机时隙算法
EN

Stack Overflow用户
提问于 2012-03-05 03:00:38
回答 4查看 510关注 0票数 0

我有一个二维数组。我想随机挑选一个插槽,并继续这样做,在我最终挑选完所有插槽之前,决不会挑选相同的插槽两次(所以最后一次挑选当然不是随机的)。有没有一个广为人知的算法来做这件事?我使用的是C#,但显然这更多的是关于算法,而不是任何特定的平台。是的,“大书”在我的购买清单上:)

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-03-05 04:20:25

使用前面提到的Fisher-Yates shuffle算法( O(n)时间)

代码语言:javascript
复制
int X = 3;  int Y = 4;
int[] array = new int[X * Y];

for (int i = 0; i < array.Length; i++) array[i] = i;
FisherYatesShuffle(array);

var randomSlots = array.Select((i,j) => new {x=array[j]%X , y=array[j]/X })
                       .ToArray();

代码语言:javascript
复制
public static void FisherYatesShuffle<T>(T[] array)
{
    Random r = new Random();
    for (int i = array.Length - 1; i > 0; i--)
    {
        int j = r.Next(0, i + 1);
        T temp = array[j];
        array[j] = array[i];
        array[i] = temp;
    }
}
票数 3
EN

Stack Overflow用户

发布于 2012-03-05 03:04:45

看一看。它被设计成从一个集合中选择一个随机的排列。

票数 5
EN

Stack Overflow用户

发布于 2012-03-05 03:05:37

假设你的数组是这样的:

代码语言:javascript
复制
Random rand = new Random();

object[,] array = new object[width,height];
bool[,] chosen = new bool[width,height];

int i, j;
do
{
    i = rand.Next(width);
    j = rand.Next(height);
} while (chosen[i,j]);

chosen[i,j] = true;
object current = array[i,j];

这应该可以很好地工作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9557883

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档