Как избежать генерации повторяющихся чисел с помощью RandomStringUtils.random из Apache Commons Jar

Я использую класс пакета Apache Commons Lang3 RandomStringUtils, После генерации некоторых чисел, RandomStringUtils.randomNumeric генерирует повторяющиеся числа в бесконечном цикле. Как я могу предотвратить это?

Вот мой код:

quantity = 100000
insertedNum = 0;
length = 9;
String[] numGen = new String[100];
idx = 1;

while (insertedNum < quantity) {
    String random=RandomStringUtils.randomNumeric(length);
    numGen[idx - 1] = random;
    if (idx == 100) {
        insertedNum += DB Code. If unique constraint error then discard batch return 0 else execute batch return inserted count.
        idx = 1;
        numGen = new String[100];
    }
    else
        idx++;
    }
}

2 ответа

Во-первых, у вас есть ошибка numGen[idx - 1] = random;

При первом входе в цикл idx равен 0, поэтому вы присваиваете значение полю -1 в numGen. Во-вторых, это не будет продолжаться вечно, но если это произойдет в течение длительного времени, вы можете использовать другой подход при создании строк, вместо удаления всего пакета, регенерируйте их один за другим, если они существуют в текущем пакете.

Попробуйте проверять после каждого поколения, если число еще не было сгенерировано в этой партии. Вы можете использовать карту Java или установить, чтобы отметить все просмотренные номера в пакете для ускорения поиска.

Поэтому добавьте код для вашего решения, чтобы он выглядел примерно так:

quantity = 100000
insertedNum = 0;
length = 9;
String[] numGen = new String[100];
idx = 0;
Set<string> seenThisBatch = new HashSet<string>();
while (insertedNum < quantity) {
            String random=RandomStringUtils.randomNumeric(length);
            //in case of duplicates, keep on generating
            while(seenThisBatch.contains(random){
                  random=RandomStringUtils.randomNumeric(length);
            }
            //add it to set
            seenThisBatch.add(random);
            numGen[idx - 1] = random;
            if (idx == 100) {
                //clear the batch set
                seenThisBatch.clear();
                insertedNum += DB Code. If unique constraint error then discard batch return 0 else execute batch return inserted count.
                idx = 1;
                numGen = new String[100];
            }
            else
              idx++;
        }

Громоздким подходом было бы продолжать регенерировать случайные строки, пока вы не обнаружите, что вы столкнулись с уникальной случайной строкой, которая еще не содержится в вашем массиве. Все, что вам нужно сделать, это проверить, находится ли вновь сгенерированная случайная строка уже в массиве или нет

quantity = 100000
insertedNum = 0;
length = 9;
String[] numGen = new String[100];
idx = 0;
String random = "";
while (insertedNum < quantity) {
            random=RandomStringUtils.randomNumeric(length);
            while( isAlreadyInArray( numGen , random ) )
            {
                //regenerate a random string
                random = RandomStringUtils.randomNumeric( length );
            }
            // Add it to your array, and increment it by one
            numGen[idx] = random;
            idx = (idx + 1) % numGen.length;
            // In this case, the array got populated to completion
            if (idx == 0) {
                System.out.println( java.util.Arrays.toString( numGen ) );  
                //clear the batch set
                insertedNum += DB Code. If unique constraint error then discard batch return 0 else execute batch return inserted count.
                numGen = new String[100];
            }
        }

А вот и вспомогательный метод isAlreadyInArray(массив String[], строка String someVal)

public boolean isAlreadyInArray( String[] mData , String strToCheck )
{
    for( int x = 0; x < mData.length; x++ )
    {
        if( mData[x] != null && mData[x].equalsIgnoreCase( strToCheck ) )
        {
            return true;    
        }
    }
    return false;
}

Пожалуйста, запустите этот пример, и если он не поможет, то, конечно, мы можем повторить проблему:)

Другие вопросы по тегам