Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将随机(条形码值)数字映射到集合中的字符串的好算法是什么?_Java_Algorithm_Barcode - Fatal编程技术网

Java 将随机(条形码值)数字映射到集合中的字符串的好算法是什么?

Java 将随机(条形码值)数字映射到集合中的字符串的好算法是什么?,java,algorithm,barcode,Java,Algorithm,Barcode,假设我的应用程序有有限数量的“东西”,在我的情况下,它们将是我游戏中的物品,但出于这个问题的目的,我将使用字符串 假设我有5个字符串: 詹姆斯 戴夫 约翰 史蒂夫 杰克 他们将有一个固定的名单,但我会在未来增加这个名单 问题:我可以使用什么好的算法,从随机数(由条形码生成)转换为上述值之一 例如,如果我有值4523542354254,那么我可以使用什么算法将其映射到Dave?如果我有同样的号码,我需要确保它每次都映射到Dave,而不是映射到其他号码 我考虑过的一个选择是使用条形码的最后一个数字,

假设我的应用程序有有限数量的“东西”,在我的情况下,它们将是我游戏中的物品,但出于这个问题的目的,我将使用字符串

假设我有5个字符串:

  • 詹姆斯
  • 戴夫
  • 约翰
  • 史蒂夫
  • 杰克
  • 他们将有一个固定的名单,但我会在未来增加这个名单

    问题:我可以使用什么好的算法,从随机数(由条形码生成)转换为上述值之一

    例如,如果我有值4523542354254,那么我可以使用什么算法将其映射到
    Dave
    ?如果我有同样的号码,我需要确保它每次都映射到
    Dave
    ,而不是映射到其他号码

    我考虑过的一个选择是使用条形码的最后一个数字,使用<代码> 0~9>代码>映射到10个条目,但是如果我添加了第十一个条目,它就不是很有前途的证明了。


    有什么建议吗?

    嗯。。。如果可以将多个值映射到一个值,则可以使用

    string name = names[value % number_of_names];
    

    “如果我再次拥有相同的数字,我需要确保它每次都映射到Dave,而不是其他对象。”这一澄清只适用于字符串集不变的情况

    最简单的是Maverik所说的,
    name=names[barcode%names.length]

    Java
    long
    足够大,可以存储任何UPC条形码,
    int
    不是,所以我假设这里的
    barcode
    long
    。请注意,UPC条形码的最后一位数字是base-11,它可以是
    X
    。我把它作为一个练习留给读者如何将条形码映射到数字。一种选择是,一旦确定校验位正确,就放弃校验位——它是根据其他校验位计算出来的,因此它不会添加任何信息或区分任何其他相等的代码

    但是正如Stephen C所说,条形码并不是随机的,所以这可能不会给你一个统一的名称分布

    为了获得更好的分发,您可以首先对条形码进行散列。例如
    name=names[String.valueOf(barcode).hashCode()%names.length]

    这可能仍然不是完全一致的——有比
    String.hashCode
    更好但通常更慢的哈希函数——但它可能避免了现实生活中条形码可能存在的任何主要偏差

    此外,我不记得Java模数运算符是否为负输入返回负结果-如果是,则需要将其强制为正范围:

    int idx = String.valueOf(barcode).hashCode() % names.length;
    if (idx < 0) idx += names.length;
    
    int idx=String.valueOf(条形码).hashCode()%names.length;
    如果(idx<0)idx+=names.length;
    
    您对字符串的使用方式有限制吗?还是应该是动态的?规程问题!条形码编号不是随机数。由条形码生成的数字也不是随机的。它应该是动态的。该应用程序将以10开始,但我会增加更多(可能数百)。这意味着条形码将提供更多种类的
    名称
    @Stephen:
    s/random/arbitral/g
    @Steve-我不确定这是真的。如果数字是由条形码生成的,那么它也不是任意的。(条形码可能是,但数字不是。)如果您添加用户可以选择条形码的可能性。。。甚至他/她自己创建,那么条形码也不是任意的。+1-简单的解决方案是最好的。如果是“不好”,这个问题就没有意义了。。。除非你假设在这个游戏中只有5个条形码/随机数。如果我添加更多字符串,我很乐意放弃以前的映射,这会改变你的回答吗?