【问题标题】:java: generating random numbers in a loopjava:在循环中生成随机数
【发布时间】:2012-01-24 23:39:42
【问题描述】:

我不确定我对 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(或其他内容),然后它无限重复该消息。我不明白为什么。是否没有生成新的随机数?还是选择方法返回相同结果而不查看新参数的唯一解释?也许是缓存问题?这是在 tomcat/MS SQL 上。

【问题讨论】:

  • 考虑使用java.util.UUID 生成唯一的invoice_names。

标签: java caching random


【解决方案1】:

我认为问题出在这一行:

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

在您第一次设置x_invoice_num 值后,它将永远不会再次为空,因此永远不会更新。 我认为您根本不希望 put() 有条件。

【讨论】:

  • 是的,我也刚刚意识到这一点,但 SO 会让我这么快回答我自己的问题。不过谢谢!我会在允许的时候给你功劳。
猜你喜欢
  • 2013-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多