Queustion 1:我们能否生成8位数独特的9-10万个仅数字字符串?
Queustion 2:如何在一个程序运行中生成9到1000万个唯一的“仅数字”字符串?这些密钥将上传到db以供将来6个月使用。我试过了
Math.floor(Math.random() * 10000000) + 10000000;
在一个循环中,但会产生大量重复。为了消除重复,我使用了HashSet,但是我在线程“main”java.lang.OutOfMemoryError中得到了Exception:集合中大小为~140xxxx之后的Java堆空间。还有其他任何方法来生成此输出吗?
答案 0 :(得分:4)
创建唯一随机数块的标准方法是首先按顺序创建数字(例如,在数组中),然后将它们随机播放。
您需要小心选择改组算法;我听说Fisher-Yates非常好。
答案 1 :(得分:1)
如果是一次运行,只需使用命令行选项-Xmx2048M
增加堆(2G只是示例)。
答案 2 :(得分:1)
<强> Q1。我们能否生成8位数独特的9-10万个仅数字字符串?
是的,您可以使用10位数生成10000000个8位唯一数字字符串1,2,3,4,5,6,7,8,9,0
如果您为所有可能的组合编写正确的逻辑,您将不会得到任何重复,但只是为了安全起见,您可以使用set。
当您收到java.lang.OutOfMemoryError错误时,因为您生成了很多数字并将其保留在内存中。对此的解决方案是生成一小部分数字并将其保存到数据库中,然后清除列表并再次填充下一个数字块并保持重复,直到将所有数字保存到数据库中。
<强> Q2。如何生成9到1000万个唯一的数字&#39;一个程序中的字符串运行?
这是一个组合代码,您可以使用它来实现目标
public class Combination{
public static int count = 0;
public static ArrayList<String> list;
public Combination(){
list = new ArrayList<String>();
}
public static void main(String[] args){
Combination c = new Combination();
Scanner sc = new Scanner(System.in);
String str = sc.next();
int num = sc.nextInt();
if(num>str.length()){
System.out.println("This combination is not possible");
System.out.println(num+" should be less than or equal to the length of the string "+str);
}else{
System.out.println("Processing....");
char[] array = new char[num];
c.fillNthCharacter(0,array,str);
System.out.println("Total combination = "+count);
}
}
public static void fillNthCharacter(int n,char[] array,String str){
for(int i=0;i<str.length();i++){
array[n]=str.charAt(i);
if(n<array.length-1){
fillNthCharacter(n+1,array,str);
}else{
count++;
//System.out.println(new String(array));
list.add(new String(array));
if(list.size()>100000){
//code to add into database
list.clear();
}
}
}
}
}
答案 3 :(得分:1)
我只是增加了vm内存大小并运行应用程序以生成900万个优惠券。感谢大家有兴趣回答这个问题。
答案 4 :(得分:0)
您可以将它们存储在数据库中,并将索引放在存储它们的列上(如果发生DuplicateKeyException,则显示一个唯一的约束和一个循环来重试)。更好的是,您可以编写存储过程来执行此操作并直接在数据库上操作。我在为url生成短代码时使用这种方法(可能会导致重复)。如果您的时间要求不严格,这是一个可行的选择。