gpt4 book ai didi

c# - 如何从 C# 中的字符串生成非随机数?

转载 作者:行者123 更新时间:2023-11-30 13:36:34 24 4
gpt4 key购买 nike

我想获取一个字符串并生成一个 0-9 之间的数字。我得到的数字不一定是可预测的,但相同的字符串必须始终生成相同的数字。

我最初的想法是只执行 string.GetHashCode() 并从代码中取出最后一位数字。

如果我这样做,我是否可以 (a) 保证对于相同的字符串总是以相同的数字结束,并且我 (b) 是否可以以 0-9 之间合理均匀的数字分布结束?

或者,有没有更好的方法来实现我想要的?

最佳答案

这应该可以解决问题 - 我将其用于确定性模拟:

public static long GetDeterministicId(string m)
{
return (long) m.ToCharArray().Select((c, i) => Math.Pow(i, c%5)*Math.Max(Math.Sqrt(c), i)).Sum();
}

编辑

如果您只想要数字 0-9,则进一步 mod 10:

public static long GetDeterministicId(string m)
{
return (longg) m.ToCharArray().Select((c, i) => Math.Pow(i, c%5)*Math.Max(Math.Sqrt(c), i)).Sum() % 10;
}

我已经针对 1000 个最常用的英语单词 ( https://gist.github.com/deekayen/4148741#file-1-1000-txt ) 运行了这个,0-9 的分布是:

0 -> 156
1 -> 163
3 -> 114
7 -> 79
6 -> 72
9 -> 55
2 -> 128
8 -> 45
5 -> 89
4 -> 99

虽然不完美,但还可以。

编辑 2

进一步的测试表明,将第一个模数替换为 8(即 Math.Pow(i, c%8)*)会产生更好的分布:

0 -> 95
1 -> 113
2 -> 148
3 -> 91
4 -> 68
5 -> 92
6 -> 119
7 -> 79
8 -> 99
9 -> 96

编辑 3

好的,获胜者是

return (int)m.ToCharArray().Select((c, i) => Math.Pow(i+2, c % 8) * Math.Max(Math.Sqrt(c), i+2)).Sum() % 10;

0 - 9 的分布是

0 -> 90
1 -> 96
2 -> 100
3 -> 99
4 -> 97
5 -> 106
6 -> 110
7 -> 90
8 -> 103
9 -> 109

这对于均匀分布来说已经足够接近了!

关于c# - 如何从 C# 中的字符串生成非随机数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32400453/

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