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_Date_Random - Fatal编程技术网

Java 即使应用程序在一天内关闭,如何生成唯一的随机数 要求:

Java 即使应用程序在一天内关闭,如何生成唯一的随机数 要求:,java,algorithm,date,random,Java,Algorithm,Date,Random,我需要生成4位非重复的数字-即使我的应用程序关闭,生成的数字也不必重复 我不想在任何存储器中存储以前的所有号码 有没有哪种算法最有可能在一天内产生最多的唯一数 谢谢不要生成随机数。相反,生成从0000到9999的序列号,然后使用中描述的技术对其进行模糊处理 这样,你唯一需要保存的就是下一个序列号 该示例使用乘法逆将0到100之间的数字映射到相同范围内的其他数字。0到100之间的每个数字都将映射到0到100之间的唯一数字。它既快速又简单,您可以通过更改常量来更改映射 有关详细信息,请参见不要生成随

我需要生成
4位
非重复的数字-即使我的应用程序关闭,生成的数字也不必重复

  • 我不想在任何存储器中存储以前的所有号码

  • 有没有哪种算法最有可能在一天内产生最多的唯一数


    谢谢

    不要生成随机数。相反,生成从0000到9999的序列号,然后使用中描述的技术对其进行模糊处理

    这样,你唯一需要保存的就是下一个序列号

    该示例使用乘法逆将0到100之间的数字映射到相同范围内的其他数字。0到100之间的每个数字都将映射到0到100之间的唯一数字。它既快速又简单,您可以通过更改常量来更改映射


    有关详细信息,请参见不要生成随机数。相反,生成从0000到9999的序列号,然后使用中描述的技术对其进行模糊处理

    这样,你唯一需要保存的就是下一个序列号

    该示例使用乘法逆将0到100之间的数字映射到相同范围内的其他数字。0到100之间的每个数字都将映射到0到100之间的唯一数字。它既快速又简单,您可以通过更改常量来更改映射

    更多信息

    10000太少了 在0到9999范围内生成多个随机数不太可能成功。取决于你需要多少这样的数字,你很可能会遇到重复的。这似乎相当明显

    加密强随机数发生器 至于生成最大的随机性,您需要一个能够生成输出的

    java.security.SecureRandom
    Java在类中提供了这样一个野兽。学习课程文档中的选项

    SecureRandom secureRandom = new SecureRandom();
    
    请注意,
    SecureRandom
    java.util.Random
    。在该界面上,您可以找到方便的方法,例如。您将获得一个伪随机、均匀分布的int值,该值介于0(包含)和指定值(独占)之间

    让我们试试看

    SecureRandom secureRandom = new SecureRandom();
    for( int i = 1 ; i <= 20 ; i ++ ) 
    {
        System.out.println( secureRandom.nextInt( 10_000 ) ) ;
    }
    
    SecureRandom SecureRandom=new SecureRandom();
    因为(int i=1;i一万太少了
    在0到9999的范围内生成多个随机数不太可能成功。根据您需要的随机数的多少,您很可能会遇到重复的随机数。这似乎相当明显

    加密强随机数发生器 至于生成最大的随机性,您需要一个能够生成输出的

    java.security.SecureRandom
    Java在类中提供了这样一个beast

    SecureRandom secureRandom = new SecureRandom();
    
    请注意,
    SecureRandom
    是一个
    java.util.Random
    。在该接口上,您可以找到方便的方法,例如。您可以获得一个伪随机的、均匀分布的int值,该值介于0(包括)和指定值(排除)之间

    让我们试试看

    SecureRandom secureRandom = new SecureRandom();
    for( int i = 1 ; i <= 20 ; i ++ ) 
    {
        System.out.println( secureRandom.nextInt( 10_000 ) ) ;
    }
    
    SecureRandom SecureRandom=new SecureRandom();
    
    对于(int i=1;i我同意Basil Bourque和其他人关于您提出的方法是否“正确”的看法。但是,如果您真的想做您提出的事情,那么实现目标的一种方法是(以伪随机顺序在范围内生成尽可能多的数字,而不必存储之前生成的所有值):

    • 找到一个周期大致在所需范围内的随机数生成器
    • 要生成下一个ID,请获取生成的下一个编号,丢弃不在范围内的编号
    因此,对于四位数字,一个选项是配置为生成16位数字的生成器(即在1-16383范围内,接近1-999):

    private int seed=1;
    public int nextJobID(){
    做{
    seed=(seed^(seed>>3))&0x3fff;
    种子=(种子^(种子=10000);
    返回种子;
    }
    

    要“每天”生成一个新序列,请将“seed”设置为1到16383之间的任意数字。[这将是相同的序列,只是从不同的点开始。您可以稍微改变序列,例如,每n个作业ID取一个,其中n是一个小数字,反转轮班模式(做>>>,>而不是>,我同意Basil Bourque和其他人关于你的建议是否是“正确”的方法。但是,如果你真的想做你的建议,那么实现你的目标的一种方法是(以伪随机顺序在范围内生成尽可能多的数字,而不必存储之前生成的所有值):

    • 找到一个周期大致在所需范围内的随机数生成器
    • 要生成下一个ID,请获取生成的下一个编号,丢弃不在范围内的编号
    因此,对于四位数字,一个选项是配置为生成16位数字的生成器(即在1-16383范围内,接近1-999):

    private int seed=1;
    public int nextJobID(){
    做{
    seed=(seed^(seed>>3))&0x3fff;
    种子=(种子^(种子=10000);
    返回种子;
    }
    

    要“每天”生成一个新序列,请将“seed”设置为1到16383之间的任意数字。[这将是相同的序列,只是从不同的点开始。您可以稍微改变序列,例如,每n个作业ID取一个,其中n是一个小数字,反转轮班模式(do>>>,>而不是>,使用GUID,请参阅URL以获取重复的四位数非重复数字,使用a并加密0000到9999之间的数字。任何合理的算法都会在几分之一秒内生成所有这些数字。您可以存储以前生成的数字的校验和,以减少冲突风险,但通过这种方式,您无法确定