【问题标题】:Load random scenes without repetition using c#使用c#加载随机场景而不重复
【发布时间】:2016-08-14 09:03:50
【问题描述】:

我想使用 c# 随机加载场景而不重复。任何帮助都可以。 谢谢。

int[] array = new int[] { 1, 2, 3, 4, 6, 8, 9, 10, 11, 12 };
List<int> list = new List<int>();

void Start()
{
    list.AddRange(array);
}

int GetUniqueRandom(bool RemoveFromTheList)
{
    if (list.Count == 0)
    {
        if (RemoveFromTheList)
        {
            list.AddRange(array);
        }
        else
        {
            return -1; // never repeat
        }
    }

    int rand = Random.Range(0, 10);
    int value = list[rand];
    list.RemoveAt(rand); return value;
}

【问题讨论】:

  • 你没有发布任何代码。
  • int[] array = new int[] { 1, 2, 3, 4, 6, 8, 9, 10, 11, 12 };列表 列表 = 新列表();无效开始(){列表。添加范围(数组); } int GetUniqueRandom(bool RemoveFromTheList) { if (list.Count == 0) { if (RemoveFromTheList) { list.AddRange(array); } 其他 { 返回 -1; // 从不重复 } } int rand = Random.Range(0, 10);整数值 = 列表 [兰德]; list.RemoveAt(rand);返回值; }
  • 寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。跨度>

标签: c# arrays random scene


【解决方案1】:

一个很好的干净方法是打乱数组,然后将所有元素放入堆栈中。获取随机元素所需要做的就是从堆栈中弹出一个项目。

您将要删除字段列表中的列表并替换为该列表;

Stack remainingScenes = new Stack();

删除 Start() 方法的内容 - 你不需要它。

在你的方法中获取一个新号码;

if (remainingScenes.Count == 0) {
    int n = array.Length;
        while (n > 1) 
        {
            int k = rng.Next(n--);
            T temp = array[n];
            array[n] = array[k];
            array[k] = temp;
        }

        foreach(var element in array) { 
             remainingScenes.Push(element);
        }
}

return remainingScenes.Pop();

shuffle方法是from here

【讨论】:

  • 仍然无法正常工作。你有简单的方法来随机场景而不重复直到场景全部加载?使用数组而不是列表。
  • 有什么用?我已经给你逐行编辑你的代码。
  • 问题是,我不知道我会在哪里附加或拖动这个脚本。
【解决方案2】:

嗯,这看起来很简单。从您的代码来看,您只需稍作修改即可使其工作..

List<int> list = new List<int>() { 1, 2, 3, 4, 6, 8, 9, 10, 11, 12 };

int GetUniqueRandom(bool RemoveFromTheList)
{
    if (list.Count == 0)
    {
        return -1;//nothing in the list so return negative value
    }
    //generate random index from list
    int randIndex = Random.Range(0, list.Count - 1);
    int value = list[rand];
    if(RemoveFromTheList)
    {
        list.RemoveAt(randIndex);
    }
    return value;
}

【讨论】:

  • 我将把这个脚本附在哪里?
【解决方案3】:

试试这个:

int[] array = new int[] { 1, 2, 3, 4, 6, 8, 9, 10, 11, 12 };
Stack<int> stack = null;

然后像这样初始化:

var rnd = new Random();
stack = new Stack<int>(array.OrderBy(x => rnd.Next()));

现在你只需不断地从堆栈中获取值,直到它为空:

var value = stack.Pop();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-23
    • 2011-06-19
    • 1970-01-01
    • 2015-07-12
    • 1970-01-01
    • 1970-01-01
    • 2016-04-08
    相关资源
    最近更新 更多