Java: генерация случайных чисел в цикле - PullRequest
0 голосов
/ 25 января 2012

Я не уверен, что я правильно использую класс Random - возможно, я неправильно его интерпретирую. (Однако я видел это много раз в моих Google.)

Я пытаюсь сгенерировать уникальные номера счетов-фактур, объединяя случайное число и строку, просматривая этот счет в базе данных, чтобы выяснить, существует ли он, и если это так, то создайте новый номер счета и повторите попытку. Ниже приведен мой код, и ниже этот метод используется для проверки правдивости предложения while:

String iname = "foo";
int sequence = 0;
String invoice_name = "";
Random generator = new Random();
do {
  sequence = generator.nextInt( 1000 );
  invoice_name = iname + String.format("%03d", sequence);
} while( !isUniqueInvoiceName( invoice_name, params, qb )

// QueryBatch is just a caching mechanism and batch committer for queries
private boolean isUniqueInvoiceName(String invoice_name, HashMap params, QueryBatch qb) {
  if( params.get("x_invoice_num") == null ) params.put( "x_invoice_num",invoice_name );
  // Invoice.select returns the primary key of the top 1 invoices found, or 0 if none found.
  int pk = Invoice.select(params, qb);
  System.out.println("============= pk = " + pk + " =============");
  return ( pk == 0 );
}

Что происходит, так это то, что журнал ошибок показывает pk = 13 (или что-то в этом роде), а затем повторяет это сообщение бесконечно. Я не понимаю почему. Новое случайное число не генерируется? Или единственное объяснение, что метод select возвращает те же результаты, не глядя на новые параметры? Может быть проблема с кешированием? Это на tomcat / MS SQL.

1 Ответ

2 голосов
/ 25 января 2012

Я думаю, что проблема в этой строке:

if( params.get("x_invoice_num") == null ) params.put( "x_invoice_num",invoice_name );

после того, как вы в первый раз установите значение x_invoice_num, оно никогда больше не будет нулевым, поэтому оно никогда не будет обновляться.Я думаю, вы не хотите, чтобы put() был условным.

...