2013-03-12 209 views
1

我想要做的就是让我创建的游戏每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; 
    } 
} 
+0

一个真正的随机数将包括重复这样试图排除这意味着@JoeW我认为这是该点的数量是不是真的随机 – 2013-03-12 12:15:55

+0

,否则rand.Next()就足够了 – Hannesh 2013-03-12 12:58:53

+0

@Hannesh点是随机的不是随机的数字? – 2013-03-12 13:01:23

回答

0

也许只是把它变成一个循环,而不是一个单一的检查?
此外,我认为,因为你的计时器是在else里面,所以并不总是 更新正确。

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

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

    num = tempNum; 
    timer = 5.0f; 
} 
1

考虑到,如果你挑选(例如)1-5之间的随机数则有五种可能的结果,因此会使用rand.Next(5)选择的零基础的“序”或索引结果,然后将其转换为您实际需要的范围(在这种情况下,通过添加一个)。

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

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

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

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; 
}