重复数不超过2的随机数生成器

时间:2018-07-06 12:16:46

标签: c# unity3d

我有从51个精灵中随机选择15个精灵的代码。它可以生成2个重复的精灵(我可以接受),但我想避免3个重复的值。我该如何预防?

我的代码

for (int i = 0; i < 16; i++)
{
    int arrIndex = UnityEngine.Random.Range(0, tasSprites.Length);
    tasSprite = tasSprites[arrIndex];
    tasName = tasSprite.name;
    taslar.Add(Int32.Parse(tasName));
}

3 个答案:

答案 0 :(得分:5)

您是否尝试过检查每个生成的索引在taslar中是否已经出现过两次,如果已经出现过,是否又生成了另一个?

while (taslar.Count < 16)
{
    int arrIndex = UnityEngine.Random.Range(0, tasSprites.Length);
    tasSprite = tasSprites[arrIndex];
    tasName = tasSprite.name;
    int value = Int32.Parse(tasName);
    if (taslar.Count(t => t == value) < 2)
    {
        taslar.Add(value);
    }
}

答案 1 :(得分:2)

您可以执行以下操作:

int[] indexesCount = new int[tasSprites.Length];

while (taslar.Count < 16)
{
    int arrIndex = UnityEngine.Random.Range(0, tasSprites.Length);

    if (indexesCount[arrIndex] == 2)
    {
        continue;
    }

    indexesCount[arrIndex]++;

    tasSprite = tasSprites[arrIndex];
    tasName = tasSprite.name;
    taslar.Add(Int32.Parse(tasName));
}

请注意,当tasSprites.Length相对较小时,此解决方案是“好的”。我们正在创建一个tasSprites.Length大小的临时数组,以查看已经使用了哪些数字。

答案 2 :(得分:1)

  • 使用两次精灵分别生成一个数组
  • 使用例如从数组中选择15个值Fisher-Yates shuffle

这将为您避免可能重复生成已经使用两次的值的机会。