【问题标题】:How to generate random numbers with restrictions on like numbers and powers of ten如何生成具有相似数和十次幂限制的随机数
【发布时间】:2011-07-08 05:27:17
【问题描述】:
We need to generate random numbers within a certain digit range with few restrictions 
e.g. For double digit range 11 - 99, the resultant output should not include all like numbers [11,22,33,44,...99] and multiples of 10 [20,30,40....90]

The resultant output should be [12,13,14,15,16,17,18,19,21,23,...98]

注意:此功能也可以无缝地用于其他数字范围(例如,跨越 101 - 999 的 3 位范围和跨越 1001 - 9999 的四位范围)

我们很难识别相似的数字(例如 11、22、33、44、55、66、77、88、99、111、222、333、...、3333 ...)

编辑1:

protected static List<Integer> fetchRandIntegers(int min, int max, int howMany, boolean randomize) {

    // We need to reverse minimum, maximum values for negative ranges
    if (min > max) {
        int tmp = min;
        min = max;
        max = tmp;
    }

    List<Integer> allNumbers = new ArrayList<Integer>();
    for (int i = min; i <= max; i++) {
        allNumbers.add(i);
    }

    if (randomize) {
    ...
    }

    return allNumbers;

}

【问题讨论】:

  • 听起来这个人有相同的作业stackoverflow.com/questions/6620840/…
  • @Peter - 我来这里是为了解决我在编码过程中遇到的真正问题。只是看到一些疯狂的cmets很烦人,这与问题无关。我想我只是在浪费时间试图解释。
  • 如果你真的阅读这篇文章,你会看到同一个问题有很多答案。我发现人们懒得去阅读那些试图帮助他们的人的答案,这太疯狂了。顺便说一句,我发现其他人会在你提出一个小时内就这样一个独特的问题提出问题,这是一个惊人的巧合。无论如何,我今天已经给出了一次答案,它涵盖了您的全部要求,而不仅仅是其中的一部分,并且不使用循环,因此可能会更快。
  • @peter 也许它是相关的,但很难说,因为它被表述为“帮助我用 gotos 将这个疯狂的 c++ 代码翻译成 java”,这是关于随机数生成的。
  • @Jeff,但数字序列完全相同。 ;)

标签: java math


【解决方案1】:

识别整数 i 是否所有数字都相同:

  • i 转换为string 并比较字符,或者
  • 反复取模并除以 10 并检查所有取模是否相同

类似:

public boolean hasAllDigitsSame (int i)
{
    int a = i ;
    int m = a % 10 ;
    int mm = m ;
    while(a > 0)
    {
        m = a % 10;
        if (m != mm)
          return False ;
        a /= 10 ;
    }
    return True ;
 }

判断整数i是否是10的倍数(100, 1000):

  • 检查i modulo 10 是否为0

【讨论】:

  • 是否有更简单的机制来查找整数是否具有相似的数字
  • 您可以使用循环创建数字的 one 版本,然后查看以这些为模的数字是否为零。如果是这样,它是一个无效的数字。例如34 % 11 = 1,所以 34 不是重复的数字。 555 % 111 = 0,所以 555 是一个重复的数字。
  • @101100:这确实很聪明。
【解决方案2】:

两个简单的选择:

  • 在范围内生成任意个随机数,如果您选择“禁止”的随机数,然后再做一次(再一次......)
  • 计算出您实际拥有多少个符合条件的数字,生成一个 [0..size) 范围内的数字,然后将其映射到一个符合条件的数字上

后者可能更有效(您不会循环生成然后丢弃的数字),但实现起来更复杂。

编辑:这是一种检查整数中所有数字是否相同的方法:

public boolean checkForAllOneDigit(int value)
{
    int digit = value % 10;
    value = value / 10;
    while (value > 0)
    {
        if (value % 10 != digit)
        {
            return false;
        }
        value = value / 10;
    }
    return true;
}

(可能有一种更优雅的方式来编写循环,但我还没有喝过咖啡......“模 11 或 111 或 1111 等”的方法也非常简洁。)

【讨论】:

  • 我们实际上从这个随机生成的列表中创建了一个数字子集,这是我们的要求。
  • 我们很难识别相似的数字(例如 11、22、111、3333 ...)。否则我们很好。
  • @Joe:尚不清楚您的第一条评论是什么意思。至于识别具有相同数字的数字 - 您可以value % 10,然后反复除以 10 并取 value % 10,直到您完成所有数字(它的形式1111、2222 等)或者你得到不同的余数(在这种情况下没关系)。请参阅我的编辑以获取一些示例代码。
【解决方案3】:

这个程序也会给出答案

import java.util.*;  

public class Generate {  

      public static void main(String[] args){  

   Scanner scan = new Scanner(System.in);  
   System.out.println("\nEnter the limit:");  
   int k = scan.nextInt();  
   int i,j,w,l,q,d;  
   for(i=13;i<=k;i++)
   {  

   j=i%10;  
   if(j!=0)  
   {  
       if(i<99)  
        {  
          for(w=1;w<=9;w++)  
               {  
                   l=11*w;  

                   if(l==i)  
                      {  

                      i++;  
                      continue ;  
                       }  
                }  
          }  
    if(i>99)  
         {  
            for(q=1;q<=9;q++)  
              {  
                 d=111*q;  

                  if(d==i)  
                      {  

                      i++;  
                      continue ;  
                      }  
              }  
         }  
      System.out.println(i);  

    }  
   }  

}  
}  

我知道这个程序很大,只是为了给出一个想法,我已经给出了这个。但我相信它会给出正确的答案!

【讨论】:

    【解决方案4】:

    您愿意使用多大的查找表? (将连续范围映射到没有禁止值的更大范围。)

    或者进行检查(如果小于 100,则为 10 和 11 的倍数,如果小于 1000,则为 111 和 100 的倍数,等等),如果鱼太小,则将其扔回去?

    【讨论】:

    • 我想排除 10 的任意倍数和类似的数字,与范围无关
    猜你喜欢
    • 1970-01-01
    • 2018-06-23
    • 2019-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 1970-01-01
    相关资源
    最近更新 更多