数组中的随机数不连续两次重复相同的数字?

时间:2015-03-05 14:56:33

标签: ios arrays swift sprite-kit arc4random

我正在使用Swift和SpriteKit制作游戏,我根据数组将对象移动到随机位置。

由CGPoints组成的数组:

let easyArray = [CGPointMake(0,0), CGPointMake(126.6,0),   CGPointMake(253.4,0), CGPointMake(0,197.5), CGPointMake(126.7,197.5), CGPointMake(253.4,197.5), CGPointMake(0,395), CGPointMake(126.7,395), CGPointMake(253.4,395)]

我使用此函数生成一个随机数:

func randomNumber(maximum: UInt32) -> Int {

    var randomNumber = arc4random_uniform(maximum)
    while previousNumber == randomNumber {
    randomNumber = arc4random_uniform(maximum)
}
    previousNumber = randomNumber
    return Int(randomNumber)
}

我用它来根据生成的随机数移动对象:

let greenEasy = randomNumberNew(9)
let moveSelector = SKAction.moveTo(easyArray[greenEasy], duration: 0)
selector.runAction(moveSelector)

我在网上做了一些阅读,发现"而且"条件应该使得相同的随机数不会连续生成两次。但它仍然会发生。

任何人都可以帮助我如何制作它,以便我连续两次获得相同的数字吗?

4 个答案:

答案 0 :(得分:5)

以下代码并非随机相同的数字。

   var currentNo: UInt32 = 0

    func randomNumber(maximum: UInt32) -> Int {

        var randomNumber: UInt32

        do {
            randomNumber = (arc4random_uniform(maximum))
        }while currentNo == randomNumber

        currentNo = randomNumber

        return Int(randomNumber)
    }

答案 1 :(得分:0)

我认为Larme's suggestion非常聪明,实际上。

easyArray.append(easyArray.removeAtIndex(Int(arc4random_uniform(UInt32(easyArray.count)-1))))
selector.runAction(SKAction.moveTo(easyArray.last!, duration: 0))

答案 2 :(得分:0)

我建议不要使用带随机函数的while()循环。

理论上它可以在最坏的情况下导致无限循环,在更积极的情况下,它只需要几个循环就可以获得所需的结果。

相反,我会建议制作一个NSArray的所有值,从NSArray中移除最后一个随机元素并随机化这样一个数组中的任何其他现有元素 - 这是仅在一次随机迭代后保证结果。

通过在Objective-C中制作NSArray类别可以轻松实现:

TOP (1)

答案 3 :(得分:0)

如果您可以使用,则可以选择与最后一个值不匹配的随机值。然后,对于任何遗留值,您可以遍历并找到插入它们的有效位置。

效率最高但效果不错。

public static List<int> Randomize(List<int> reps, int lastId) {
  var rand = new Random();

  var newReps = new List<int>();
  var tempReps = new List<int>();
  tempReps.AddRange(reps);
  while (tempReps.Any(x => x != lastId)) {
    var validReps = tempReps.FindAll(x => x != lastId);
    var i = rand.Next(0, validReps.Count - 1);
    newReps.Add(validReps[i]);
    lastId = validReps[i];
    tempReps.Remove(validReps[i]);
  }
  while (tempReps.Any()) {
    var tempRep = tempReps.First();
    bool placed = false;
    for (int i = 0; i < newReps.Count; i++) {
      if (newReps[i] == tempRep) {
        continue;
      }
      else if ((i < newReps.Count - 1) && (newReps[i + 1] == tempRep)) {
        continue;
      }
      else {
        newReps.Insert(i + 1, tempRep);
        placed = true;
        break;
      }
    }

    if (placed) {
      tempReps.Remove(tempRep);
    }
    else {
      throw new Exception("Unable to randomize reps");
    }
  }
  return newReps;
}