You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#实现机器人唯一随机名称生成的测试修复与方案优化咨询

问题根因分析

首先你现有代码的核心问题有3个:

  • usedNames 是实例级字段,每个Robot实例都会单独创建自己的字典,完全做不到全局名称唯一性校验
  • 重复创建Random实例:类实例已经有了random字段,RandomName方法里又多余声明了rand变量;而且如果是实例级Random,短时间内批量创建Robot实例时,多个Random实例会因为系统时间戳种子相同,生成完全一致的随机序列
  • 生成名称时即使检测到重复也没有做重试逻辑,直接返回了重复名称

顺序生成名称的思路可行性

这个思路是完全可行的:两位大写字母+三位数字的组合总共有 26*26*1000=676000 种,远大于测试用例的1万上限,足够满足需求。
这个方案的优缺点:

  • 优点:绝对不会生成重复名称,生成效率稳定,不会出现剩余可用名称少时反复随机重试的性能损耗
  • 缺点:如果需求要求名称是完全随机的,顺序生成的规则化名称不符合要求

更优实现方案

方案1:保留随机生成逻辑(符合原题随机名称的要求)

修改点如下:

  1. 将usedNames和Random都改为静态字段,全局共享
  2. 生成名称时加循环重试逻辑,拿到未使用的名称后存入全局集合
  3. 重置功能要先释放旧名称,再生成新名称
  4. 用HashSet代替Dictionary存储已用名称,更节省空间

修改后的代码示例:

using System;
using System.Collections.Generic;

public class Robot
{
    // 全局共享的随机实例和已用名称集合
    private static readonly Random _random = new Random();
    private static readonly HashSet<string> _usedNames = new HashSet<string>();
    private const string _chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

    public Robot()
    {
        Name = GenerateUniqueName();
    }

    private string _name;
    public string Name
    {
        get => _name;
        private set => _name = value;
    }

    public void Reset()
    {
        // 释放旧名称
        _usedNames.Remove(Name);
        // 生成新名称
        Name = GenerateUniqueName();
    }

    private string GenerateUniqueName()
    {
        string name;
        do
        {
            // 生成两位随机大写字母
            char letter1 = _chars[_random.Next(_chars.Length)];
            char letter2 = _chars[_random.Next(_chars.Length)];
            // 生成三位随机数字
            int num = _random.Next(0, 1000);
            name = $"{letter1}{letter2}{num:000}";
        } 
        // 重复就继续生成
        while (!_usedNames.Add(name));
        
        return name;
    }
}

方案2:预生成随机序列(性能最优)

如果允许提前生成所有可用名称,这个方案效率最高,完全不需要重复校验:

  1. 启动时生成所有676000个合法名称,打乱顺序后存入队列
  2. 每次创建/重置机器人时直接从队列出队拿名称
  3. 重置时把旧名称入队回收即可

内容的提问来源于stack exchange,提问作者itz4blitz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 15:45:04