1

質問 1: 8 桁の一意の 900 万から 1000 万の数値のみの文字列を生成できますか?

質問 2: 1 回のプログラム実行で 900 万から 1000 万の一意の「数値のみ」の文字列を生成するにはどうすればよいですか? これらのキーは db にアップロードされ、今後 6 か月間使用されます。私は試した

Math.floor(Math.random() * 10000000) + 10000000; 

ループ内ですが、多くの重複が生成されます。重複を排除するために HashSet を使用しましたが、スレッド "main" java.lang.OutOfMemoryError: Java heap space after ~140xxxx size in the set で例外が発生します。この出力を生成する他の方法はありますか?

4

5 に答える 5

4

一意の乱数のブロックを作成する標準的な方法は、最初に番号を順番に (たとえば、配列で) 作成し、次にそれらをシャッフルすることです。

シャッフル アルゴリズムの選択には注意が必要です。フィッシャー・イェーツはかなり良いと聞きました。

于 2014-03-05T08:52:31.220 に答える
1

一度だけ実行する場合は、コマンド ライン オプションを使用してヒープを増やします-Xmx2048M(2G は単なる例です)。

于 2014-03-05T08:53:31.620 に答える
1

単純に vm のメモリ サイズを増やし、アプリケーションを実行して 900 万枚のクーポンを生成しました。これに興味を持って答えてくれてありがとう。

于 2014-03-06T08:00:14.670 に答える
1

Q1. 8 桁の一意の 900 万から 1000 万の数値のみの文字列を生成できますか?

はい、10 桁の 1,2,3,4,5,6,7,8,9,0 を使用して 10000000 8 桁の一意の数値のみの文字列を生成できます

考えられるすべての組み合わせに対して正しいロジックを記述している場合、重複は発生しませんが、安全のために set を使用できます。

java.lang.OutOfMemoryError エラーが発生しているのは、その数を生成してメモリに保持しているためです。これに対する解決策は、いくつかの小さな数字のチャンクを生成してデータベースに保存してから、リストをクリアして、次の数字のチャンクを入力し、すべての数字をデータベースに保存するまで繰り返し続けることです。

Q2. 1 回のプログラム実行で 900 万から 1000 万の一意の「数値のみ」の文字列を生成するにはどうすればよいですか?

これは、目標を達成するために使用できる組み合わせコードです

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();
                }
            }
        }
    }
}
于 2014-03-05T12:44:37.213 に答える
0

それらをデータベースに保存し、それらを保存する列にインデックスを配置できます(明らかに一意の制約と、DuplicateKeyExceptionが発生した場合に再試行するループを使用します)。さらに良いことに、それを行うためのストアド プロシージャを作成し、データベースで直接操作することができます。URL の短いコードを生成するときにこのアプローチを使用します (重複につながる可能性があります)。時間の要件が厳しくない場合、これは実行可能なオプションです。

于 2014-03-05T08:54:02.097 に答える