为什么这种方法只随机化一次,而不是随机化每次迭代
本文关键字:随机化 迭代 一次 方法 为什么 | 更新日期: 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);
}