C#中Random()生成重复随机字符串的原因及解决方法
问题分析与解决方案:重复生成相同随机字符串
这是个很常见的Random使用误区,我来帮你拆解问题和解决办法:
问题成因
你每次调用getRandomLetterNumbers方法时都新建了一个Random实例,但Random默认是用当前系统时钟的“刻度”作为种子来生成随机序列的。你的循环执行速度极快,连续10次调用之间系统时钟根本没来得及更新,所以这些Random实例的种子完全相同,生成的随机数序列也就一模一样,最终拼出来的字符串自然重复了。
解决办法
核心思路是只创建一次Random实例,避免重复初始化导致种子相同。这里有几种实用的实现方式:
方式1:将Random作为类的成员变量
把Random实例声明在类级别,只初始化一次,整个类的方法都复用这个实例:
// 类成员变量,只初始化一次 private Random _random = new Random(); void testfunction() { for (int i = 0; i < 10; i++) { String randomname = getRandomLetterNumbers(10); listBox1.Items.Add(randomname); } } public String getRandomLetterNumbers(int nrLetterNumbers) { String letters = "abcdefghijklmnopqrstuvwxyz0123456789"; String str = ""; int rand = 0; for (int i = 0; i < nrLetterNumbers; i++) { rand = _random.Next(0, letters.Length); str = str + letters.Substring(rand, 1); } return str; }
方式2:将Random作为参数传递给方法
如果不想修改类成员变量,也可以在调用方创建唯一的Random实例,然后传递给生成方法:
void testfunction() { // 只创建一次Random实例 Random random = new Random(); for (int i = 0; i < 10; i++) { String randomname = getRandomLetterNumbers(10, random); listBox1.Items.Add(randomname); } } public String getRandomLetterNumbers(int nrLetterNumbers, Random random) { String letters = "abcdefghijklmnopqrstuvwxyz0123456789"; String str = ""; int rand = 0; for (int i = 0; i < nrLetterNumbers; i++) { rand = random.Next(0, letters.Length); str = str + letters.Substring(rand, 1); } return str; }
额外优化:用StringBuilder提升性能
循环里直接拼接字符串效率不高,推荐使用StringBuilder来构建结果,同时可以用索引直接访问字符,代码更简洁:
public String getRandomLetterNumbers(int nrLetterNumbers, Random random) { String letters = "abcdefghijklmnopqrstuvwxyz0123456789"; // 提前指定容量,进一步提升性能 StringBuilder sb = new StringBuilder(nrLetterNumbers); for (int i = 0; i < nrLetterNumbers; i++) { int rand = random.Next(0, letters.Length); sb.Append(letters[rand]); } return sb.ToString(); }
内容的提问来源于stack exchange,提问作者Andreas
相关产品推荐
相关产品推荐

