我正在从exercism.io做一个练习,我必须在其中为机器人生成随机名称。在我完成这个测试之前,我能够通过大部分测试:
[Fact]
public void Robot_names_are_unique()
{
var names = new HashSet<string>();
for (int i = 0; i < 10_000; i++) {
var robot = new Robot();
Assert.True(names.Add(robot.Name));
}
}
经过一番谷歌搜索,我偶然发现了几个解决方案,并发现了 Fisher-Yates 算法。我试图将它实现到我自己的解决方案中,但不幸的是,我无法通过最终测试,我很困惑。如果有人能指出我正确的方向,我将不胜感激。我的代码如下:
编辑:我忘了提到字符串的格式必须遵循:@"^[AZ]{2}\d{3}$"
public class Robot
{
string _name;
Random r = new Random();
string alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
string nums = "0123456789";
public Robot()
{
_name = letter() + num();
}
public string Name
{
get { return _name; }
}
private string letter() => GetString(2 ,alpha.ToCharArray(), r);
private string num() => GetString(3, nums.ToCharArray(), r);
public void Reset() => _name = letter() + num();
public string GetString(int length,char[] chars, Random rnd)
{
Shuffle(chars, rnd);
return new string(chars, 0, length);
}
public void Shuffle(char[] _alpha, Random r)
{
for(int i = _alpha.Length - 1; i > 1; i--)
{
int j = r.Next(i);
char temp = _alpha[i];
_alpha[i] = _alpha[j];
_alpha[j] = temp;
}
}
}