如何将非统一的 int 范围映射到 C# 中的某些字符串值?

Posted

技术标签:

【中文标题】如何将非统一的 int 范围映射到 C# 中的某些字符串值?【英文标题】:How do I map non-uniform int ranges to certain string values in C#? 【发布时间】:2021-12-09 14:02:10 【问题描述】:

我有一个 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 个不同的范围?

【问题讨论】:

您到底想优化什么?确实没有办法避免以某种方式写出所有范围(否则你可以如何在代码中表达它)......所以很难提出更好的选择。显然,您会使用某种数组(可能使用二进制搜索)或 BST 来存储范围,但这不会改变您必须将它们写入我们的事实。 【参考方案1】:

您可以将其划分为 N > 113 的 N 个范围,并为您希望更常见的字符串分配多个值。一种简单的方法是拥有一个字符串数组并为您希望最常见的字符串创建多个条目,然后使用数组长度的模数作为数组的索引。

var strings = new string[] 

    "Foo",
    "Foo",
    "Bar",
    "Baz"
;

int someNumber = 77777;
var index = someNumber % strings.Length;
var myString = strings[index];

当然,这种方法不能对任何给定字符串的机会进行细粒度控制(除非您创建一个包含 100,000 个条目的数组...)

【讨论】:

以上是关于如何将非统一的 int 范围映射到 C# 中的某些字符串值?的主要内容,如果未能解决你的问题,请参考以下文章

NodeJS 实战系列:模块设计与文件分类

如何将数字范围映射到 SQL Server 或 Clickhouse 中的数字

将数字重新映射到pygame中的另一个范围[重复]

如何将一个自定义实体映射到实体框架中的某些数据库表?

如何将 int 映射到 C/C++ 中的相应字符串

将向量映射到特定范围