我认为您的第一个要求(不将每个促销代码保存在数据库中)是有问题的。那么问题来了,同一个优惠码可以多次兑换吗?如果这是不允许的,那么您无论如何都必须将已经兑换的代码存储在某个持久数据存储中,那么为什么不从一开始就将生成的代码以及指示它是否已兑换的标志存储在持久数据存储中呢?如果您不想存储所有代码/无法存储所有代码,您仍然可以使用Random带有当前广告系列独有的种子的 a :long seed = 20190921065347L; // identifies your current campaignRandom r = new Random(seed);for (int i = 0; i < numCodes; i++) { System.out.println(r.nextLong());}或者long seed = 20190921065347L; // identifies your current campaignRandom r = new Random(seed);r.longs(numCodes, 100_000_000_000_000L, 1_000_000_000_000_000L) .forEach(System.out::println);要确定代码是否有效,您可以再次生成相同的代码:long seed = 20190921065347L; // identifies your current campaignRandom r = new Random(seed);System.out.println( r.longs(numCodes, 100_000_000_000_000L, 1_000_000_000_000_000L) .anyMatch(l -> l == 350160558695557L));
像这样的东西会起作用吗? Random r = new Random(); long start = 1_000_000_000; long end = 10_000_000_000L; long n = r.longs(1, start, end).reduce(0, (a, b) -> b); String s = String.format("%,d", n).replace(",", "-"); System.out.println(s);