【问题标题】:How to get random values from array in C# [duplicate]如何从C#中的数组中获取随机值[重复]
【发布时间】:2012-12-27 04:44:18
【问题描述】:

可能重复:
Access random item in list

我有一个带有数字的数组,我想从这个数组中获取随机元素。例如:{0,1,4,6,8,2}。我想选择 6 并将这个数字放在另一个数组中,新数组的值将是 {6,....}。

我使用 random.next(0, array.length),但这给出了一个随机数的长度,我需要随机数组数。

for (int i = 0; i < caminohormiga.Length; i++ )
{
    if (caminohormiga[i] == 0)
    {
        continue;
    }

    for (int j = 0; j < caminohormiga.Length; j++)
    {
        if (caminohormiga[j] == caminohormiga[i] && i != j)
        {
            caminohormiga[j] = 0;
        }
    }
}

for (int i = 0; i < caminohormiga.Length; i++)
{
   int start2 = random.Next(0, caminohormiga.Length);
   Console.Write(start2);
}

return caminohormiga;

【问题讨论】:

  • 通过简单的随机选择,您将获得重复项。您要返回caminohormiga 的随机副本吗?
  • @shebystian 是否适用重复项??
  • 您要随机播放还是旋转您的caminohormiga 数组?
  • 如果您不想要重复并假设输出,最好使用 shuffle 而不是检查重复,这需要时间
  • 如果您同意重复,请查看已接受的answer。如果您希望将其改组而不重复,请查看此answer

标签: c# .net arrays random collections


【解决方案1】:

我使用 random.next(0, array.length),但这给出了长度的随机数,我需要随机数组数。

使用random.next(0, array.length) 的返回值作为索引从array 获取值

 Random random = new Random();
 int start2 = random.Next(0, caminohormiga.Length);
 Console.Write(caminohormiga[start2]);

【讨论】:

  • 谢谢!代码终于可以工作了,但是数字是重复的,知道如何避免重复吗?
  • 是的,去掉循环中的元素形式数组。
  • 为避免重复数字,请使用IEnumerable.OrderBy(n =&gt; Guid.NewGuid())。见我的answer
  • 获取重复项可能是因为 Random 类的行为方式。尽量不要在每次获得随机数时实例化Random,保持单个实例。
【解决方案2】:

您只需要使用随机数作为对数组的引用:

var arr1 = new[]{1,2,3,4,5,6}
var rndMember = arr1[random.Next(arr1.Length)];

【讨论】:

    【解决方案3】:
    Console.Write(caminohormiga[start2]);
    

    【讨论】:

      【解决方案4】:

      这样试试

      int start2 = caminohormiga[ran.Next(0, caminohormiga.Length)];
      

      而不是

      int start2 = random.Next(0, caminohormiga.Length);
      

      【讨论】:

        【解决方案5】:

        随机播放

        int[] numbers = new [] {0, 1, 4, 6, 8, 2};
        int[] shuffled = numbers.OrderBy(n => Guid.NewGuid()).ToArray();
        

        【讨论】:

          【解决方案6】:

          我注意到在 cmets 中您不希望重复,因此您希望数字像一副纸牌一样被“洗牌”。

          我会使用List&lt;&gt; 作为源项目,随机抓取它们并将它们推送Stack&lt;&gt; 以创建数字牌组。 p>

          这是一个例子:

          private static Stack<T> CreateShuffledDeck<T>(IEnumerable<T> values)
          {
            var rand = new Random();
          
            var list = new List<T>(values);
            var stack = new Stack<T>();
          
            while(list.Count > 0)
            {
              // Get the next item at random.
              var index = rand.Next(0, list.Count);
              var item = list[index];
          
              // Remove the item from the list and push it to the top of the deck.
              list.RemoveAt(index);
              stack.Push(item);
            }
          
            return stack;
          }
          

          那么:

          var numbers = new int[] {0, 1, 4, 6, 8, 2};
          var deck = CreateShuffledDeck(numbers);
          
          while(deck.Count > 0)
          {
            var number = deck.Pop();
            Console.WriteLine(number.ToString());
          }
          

          【讨论】:

          • 不应该 rand.Next(0, list.Count);是 rand.Next(0, list.Count - 1);?因为如果我们得到例如索引 5 并且有 5 个元素,我认为我们将超出范围异常。但我喜欢你的解决方案。
          猜你喜欢
          • 2015-07-02
          • 2011-11-01
          • 2010-12-11
          • 2019-07-16
          • 2011-08-20
          相关资源
          最近更新 更多