为什么这种方法只随机化一次,而不是随机化每次迭代

本文关键字:随机化 迭代 一次 方法 为什么 | 更新日期: 2023-09-27 17:57:26

我正试图让这段代码随机挑选出4个键,然后使用"foreach"循环将它们写入控制台。它不是为每次迭代挑选一个随机选择,而是随机挑选其中一个键,并将其写入控制台4次。这是代码:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
namespace ListPractice
{
    public class DictionaryData
    {           
        public static void GetRandomKey()
        {
            Dictionary<string, int[]> QandA_Dictionary = new Dictionary<string, int[]>();
            QandA_Dictionary.Add("What is 1 + 1?", new int[] { 1, 2, 3, 4 });
            QandA_Dictionary.Add("What is 1 + 2?", new int[] { 1, 2, 3, 4 });
            QandA_Dictionary.Add("What is 1 + 3?", new int[] { 1, 2, 3, 4 });
            QandA_Dictionary.Add("What is 1 + 4?", new int[] { 2, 3, 4, 5 });
            List<string> keys = new List<string>(QandA_Dictionary.Keys);
            foreach (var element in keys)
            {
                Random rand = new Random();
                string randomKey = keys[rand.Next(keys.Count)];
                Console.WriteLine(randomKey);
            }
            Console.ReadKey();
        }
        public static void Main(string[] args)
        {
            GetRandomKey();
        }
    }
}

为什么这种方法只随机化一次,而不是随机化每次迭代

它会随机化一次,因为您一直在创建Random类的新实例。每次初始化没有种子的Random类的实例时,它都会自动使用时钟的当前刻度计数作为其种子。由于循环的迭代速度通常很快,它将在一到几毫秒内完成,这意味着你的Random几乎总是有相同的种子。

在循环外部声明Random将导致每次使用它时都会发生种子更改,因此您不会一次又一次地获得相同的编号:

Random rand = new Random();
foreach (var element in keys)
{
    string randomKey = keys[rand.Next(keys.Count)];
    Console.WriteLine(randomKey);
}