Как генерировать случайные числа с ограничениями на одинаковые числа и степенями десяти - PullRequest
2 голосов
/ 08 июля 2011
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]

Примечание. Эта функция должна беспрепятственно работать и для других диапазонов цифр (например, 3-значных диапазона, охватывающих 101 - 999 и четырехзначных диапазонов, охватывающих 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;

}

Ответы [ 4 ]

3 голосов
/ 08 июля 2011

Чтобы определить, что целое число 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.
3 голосов
/ 08 июля 2011

Два простых варианта:

  • Создайте любое случайное число в диапазоне и сделайте это снова (и снова ...), если вы выберете "забаненное"
  • Определите, сколько подходящих номеров у вас на самом деле, сгенерируйте число в диапазоне [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 и т. Д.» Тоже действительно хорош.)

2 голосов
/ 08 июля 2011

Эта программа также даст ответ

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

    }  
   }  

}  
}  

Я знаю, что эта программа довольно большая, просто чтобы дать идею, я дал это. Но я уверен, что она даст правильный ответ !!

0 голосов
/ 08 июля 2011

насколько большой справочной таблицы вы готовы использовать? (Сопоставьте последовательный диапазон с большим диапазоном, в котором нет ваших запрещенных значений.)

Или чек (если меньше 100, кратно 10 и 11, если меньше 1000 кратно 111 и 100 и т. Д.), И если рыба слишком мала, отбросьте ее обратно?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...