我有一个c#脚本,从一个随机的20位长的BigInteger中提取5位数字。然后将其转换为0到99,999之间的int值。我想使用这个数字来确定使用113个字符串的一组字符的名称。我遇到麻烦的原因是因为我不希望113个字符串中的每一个都有相同的被选中的机会,所以我不能仅仅使用模数运算符来获得字符串集合的索引。我希望映射是非统一的,以便某些名称比其他名称更少见。例如:
if(val <= 1000)
{
name = names[0];
}
if(val > 1000 && val <= 1250)
{
name = names[1];
}
if(val > 1250 && val <= 1750)
{
name = names[2];
}
有没有一种方法可以有效地映射像这样的非统一范围,而不显式地键入113个不同的范围?
你可以把它分成N个范围,其中N>113,并为您希望更常见的字符串分配多个值。一种简单的方法是创建一个字符串数组,并为您希望最常用的字符串创建多个条目,然后使用数组长度的模数作为数组的索引。
var strings = new string[]
{
"Foo",
"Foo",
"Bar",
"Baz"
};
int someNumber = 77777;
var index = someNumber % strings.Length;
var myString = strings[index];
当然,这种方法不能对任何给定字符串的出现概率进行细粒度控制(除非创建一个包含100,000个条目的数组…)