如何生成随机数,限制数字和10的幂

时间:2011-07-08 05:27:18

标签: java math

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的4位数范围)

我们在识别相同数字方面遇到困难(例如11,22,33,44,55,66,77,88,99,111,222,333,......,3333 ......)

EDIT1:

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;

}

4 个答案:

答案 0 :(得分:3)

两个简单的选择:

  • 在范围内生成任意随机数,如果选择“禁止”,则再次执行(并再次执行...)
  • 计算出您实际拥有的合格号码数量,生成[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;
}

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

答案 1 :(得分:3)

确定整数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 ;
 }

确定整数i10(100,1000)的倍数:

  • 检查i modulo 10是否为0

答案 2 :(得分:2)

该程序也将给出答案

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);  

    }  
   }  

}  
}  

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

答案 3 :(得分:0)

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

或者你的支票(如果低于100,10和11的倍数,如果低于111和100的1000倍,依此类推),如果鱼太小则扔掉它?