随机数,没有重复

时间:2013-03-12 11:57:46

标签: random xna numbers repeat

我想要做的就是让我创造的游戏每5秒随机更改一次角色。 我通过一个计时器得到这个工作,唯一的问题是我不想让它们重复,我正在研究虚拟代码所以它只是改变屏幕颜色,但我怎么能这样做它不会重复号码刚刚叫?

if (timer <= 0)
{
    num = rand.Next(2);
    timer = 5.0f;   
}

这是当前的代码,然后在绘图中,我实际上只是“如果num等于某个数字然后改变背景颜色”。

我尝试添加一个prev_num检查器,但我无法正常工作(这里是)

if (timer <= 0)
{
    prev_number = num;
    num = rand.Next(2);
    if (prev_number == num)
    {
        num = rand.Next(2);
    }
    else
    {
        timer = 5.0f;
    }
}

3 个答案:

答案 0 :(得分:1)

考虑一下,如果您从1-5中选择(例如)一个随机数,那么有五种可能的结果,因此您可以使用rand.Next(5)来选择从零开始的“序数”或索引。结果,然后将其转换为您实际想要的范围(在这种情况下,通过添加一个)。

如果你想要一个0-4的随机数,不包括你选择的数字,那么只有四种可能的结果,而不是五种 - 如果之前的数字是3,那么可能的结果是0,1,2或4.然后,您可以通过选择这四种结果之一(rand.Next(4))并将该序数映射到所需范围来简化算法。一个简单的映射就是说新的随机数是否低于前一个数字,按原样返回,否则(如果相等或更大)加一个。

int new_num = rand.Next(4);
if(new_num >= prev_num)
{
    new_num++;
}

现在保证您的新号码与前一个号码在同一范围内,但不等于它。

答案 1 :(得分:0)

也许只是将它放入循环而不是单一检查? 另外,我认为因为你的计时器在else内,所以并非总是如此 正确更新。

if (timer <= 0)
{
    tempNum = rand.Next(2);

    do
    {
        tempNum = rand.Next(2);
    }
    while (tempNum == num)

    num = tempNum;
    timer = 5.0f;
}

答案 2 :(得分:0)

创建一个连续数字数组,然后在应用程序开始时将它们洗牌(如一副牌)。

int[] numbers = new int[100];
for(int i = 0; i < numbers.Length; i++)
    numbers[i] = i;
Shuffle(numbers);

使用函数来混洗列表:

public static void Shuffle<T>(IList<T> list)  
{  
    Random rng = new Random();  
    int n = list.Count;  
    while (n > 1) {  
        n--;  
        int k = rng.Next(n + 1);  
        T value = list[k];  
        list[k] = list[n];  
        list[n] = value;  
    }  
}

然后,您可以按顺序从列表中访问它们。随着列表被洗牌,它们将是随机的,但您不会重复,因为每个数字只在列表中存在一次。

if (timer <= 0)
{
    num = numbers[index];
    index++;
    timer = 5.0f;   
}