gpt4 book ai didi

c# - 使用 Fisher-Yates 算法后的随机字符串冲突 (C#)

转载 作者:行者123 更新时间:2023-12-02 12:37:17 25 4
gpt4 key购买 nike

我正在 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 算法。我尝试将其实现到我自己的解决方案中,但不幸的是,我无法通过最终测试,我被难住了。如果有人能指出我正确的方向,我将不胜感激。我的代码如下:

编辑:我忘了提及字符串的格式必须遵循以下格式:@"^[A-Z]{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;
}

}

}

最佳答案

任何 ID 的第一条规则是:

It does not mater how big it is, how many possible value it has - if you just create enough of them, you will get a colission eventually.

引用《Hithchikers Guide》中的 Trillian 的话:“[碰撞]并非不可能。只是真的,真的不太可能。”

但是在这种情况下,我认为是您在循环中创建随机实例。这是classical beginners mistake when workign with Random 。您不应该为每个机器人实例创建一个新的随机实例,您应该为您重复使用的应用程序创建一个随机实例。与所有伪随机数生成器一样,随机是确定性的。相同的输入 - 相同的输出。

由于您没有指定种子值,因此它将使用以毫秒为单位的时间。最后,前 20 多次循环迭代之间会出现相同的情况。因此它将具有相同的种子和相同的输入,因此具有相同的输出。

关于c# - 使用 Fisher-Yates 算法后的随机字符串冲突 (C#),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60081585/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com