Random
类结合集合去重。“
csharp,using System;,using System.Collections.Generic;public class RandomNumbersGenerator,{, public static void Main(), {, Random random = new Random();, HashSet uniqueNumbers = new HashSet(); while (uniqueNumbers.Count`这段代码利用
HashSet`确保生成的随机数唯一,直到集合中有99个不同的数字为止。
在ASP.NET环境下生成99个不同的随机数,可以通过多种方式实现,以下是几种常见的方法及其详细解释:
方法一:使用System.Random
类结合集合检查重复性
1、原理:利用System.Random
类生成随机数,并使用一个集合(如HashSet<int>
)来存储已经生成的随机数,以确保每个随机数都是唯一的。
2、代码示例:
C#代码:
<%@ Page Language="C#" %> <%@ Import Namespace="System" %> <script runat="server"> void Page_Load(Object sender, EventArgs e) { HashSet<int> generatedNumbers = new HashSet<int>(); while (generatedNumbers.Count < 99) { int newNumber = new Random().Next(1, 100); // 生成1到99的随机数 if (!generatedNumbers.Contains(newNumber)) { generatedNumbers.Add(newNumber); } } foreach (int number in generatedNumbers) { Response.Write(number + " "); } } </script>
说明:上述代码首先创建了一个HashSet<int>
类型的集合generatedNumbers
用于存储生成的随机数,通过一个while
循环不断生成随机数,并检查该随机数是否已经存在于集合中,如果不存在,则将其添加到集合中,通过foreach
循环遍历集合并输出所有生成的随机数。
方法二:使用Fisher-Yates洗牌算法
1、原理:先生成一个包含所需范围内所有整数的列表,然后使用Fisher-Yates洗牌算法对列表进行随机打乱,最后选取前99个元素作为结果。
2、代码示例:
C#代码:
<%@ Page Language="C#" %> <%@ Import Namespace="System.Linq" %> <script runat="server"> void Page_Load(Object sender, EventArgs e) { List<int> numbers = Enumerable.Range(1, 100).ToList(); // 生成1到100的整数列表 System.Random random = new Random(); for (int i = numbers.Count 1; i > 0; i--) { int j = random.Next(i + 1); int temp = numbers[i]; numbers[i] = numbers[j]; numbers[j] = temp; } for (int i = 0; i < 99; i++) { Response.Write(numbers[i] + " "); } } </script>
说明:上述代码首先使用Enumerable.Range
方法生成一个包含1到100的整数列表numbers
,通过一个for
循环实现Fisher-Yates洗牌算法,对列表进行随机打乱,通过另一个for
循环遍历打乱后的列表并输出前99个元素。
方法三:使用数据库生成唯一标识符(GUID)并转换为整数(不推荐)
1、原理:虽然这不是直接生成随机数的方法,但可以利用数据库生成的唯一标识符(如GUID),并通过某种方式将其转换为整数来模拟随机数的生成,这种方法并不推荐用于生成大量随机数,因为GUID的生成和转换过程相对复杂且效率较低。
2、代码示例(仅作演示,不推荐使用):
C#代码(假设使用SQL Server数据库):
<%@ Page Language="C#" %> <%@ Import Namespace="System.Data.SqlClient" %> <script runat="server"> void Page_Load(Object sender, EventArgs e) { string connectionString = "your_connection_string"; using (SqlConnection connection = new SqlConnection(connectionString)) { connection.Open(); for (int i = 0; i < 99; i++) { string guid = Guid.NewGuid().ToString(); int randomNumber = Convert.ToInt32(guid.GetHashCode()); Response.Write(randomNumber + " "); } } } </script>
说明:上述代码首先建立与数据库的连接,然后在循环中生成99个GUID,并将每个GUID的哈希值转换为整数作为随机数输出,但请注意,这种方法生成的“随机数”并不具有真正的随机性,且可能存在碰撞问题。
1、问:为什么需要使用集合来检查随机数的重复性?
答:在生成随机数的过程中,如果不进行检查,很可能会生成重复的随机数,使用集合可以方便地存储和检查已经生成的随机数,从而确保每个随机数都是唯一的。
2、问:Fisher-Yates洗牌算法有什么优点?
答:Fisher-Yates洗牌算法是一种高效的随机打乱数组的方法,它能够确保数组中的每个元素都有相等的概率被交换到任何位置,从而生成一个均匀分布的随机序列,在生成大量随机数时,使用该算法可以避免复杂的重复性检查逻辑,提高代码的执行效率。