0

私はJavaで100万から100万の間の数を生成するプログラムを作りたいのですが、数を複製したり、誰かを見逃したりしてはいけません。どこから始めたらいいのかわからない。使用したすべての番号を記録することはできません。これは実用的ではありません。どうすればこれを行うことができますか?

4

5 に答える 5

2

1から1,000,000までの整数を配列リストに格納します。リストをランダムにシャッフルし、その内容を印刷します。

于 2012-11-28T11:11:59.220 に答える
2

したがって、次のことを行う必要があります。

  • 1〜1,000,000(両端を含む)の数値を出力します
  • ランダムな順序で
  • 重複や繰り返しなし
  • 出力した数値を追跡せずに

これは、答えが次のような苛立たしい質問の1つです。それはできません。

それで、私は質問の基礎に挑戦します:百万の数、バイトあたり8ビット、それは数のビットフラグを保存するために122kです。マイクロコントローラーで実行しているのでない限り、それは問題にはなりません。したがって、かなり制約のある環境でも、 NPEが提案したようなことを実行できるはずです。

しかし、あなたが数字を保存することができない限り、あなたはそれをすることができません。

(これは、コミュニティがコメントで言ったことを要約しているだけであり、「それはできない」以外は「NPEの答えを見てください」と言っているだけなので、CWにしました。)

于 2012-11-28T11:21:32.463 に答える
2

これを行う1つの方法は、疑似ランダムウォークを使用することです。単純な疑似ランダムウォークでは、任意の大きな素数(制限に共通の要因がないことを確認するため)とモジュラスを使用して値をラップし、繰り返される前にすべてのN値を取得します。

これは、限界として100を使用し、素数として47を使用する小さな例です。これを変更して、制限として1000000を使用し、513239のようなより大きな素数を使用することができます。

int last = 0;
for (int i = 0; i < 100; i++) {
    last = (last + 47) % 100;
    System.out.println(last + 1);
}

プリント

48 95 42 89 36 83 30 77 24 71 18 65 12 59 6 53100 47 94 41 88 35 82 29 76 23 70 17 64 11 58 5 52 99 46 93 40 87 34 81 28 75 22 69 16 63 10 57 4 51 98 45 92 39 86 33 80 27 74 21 68 15 62 9 56 3 50 97 44 91 38 85 32 79 26 73 20 67 14 61 8 55 2 49 96 43 90 37 84 31 78 25 72 19 66 13 60 7 54 1

これをよりランダムに表示するには、2つの疑似ランダムウォークを組み合わせて使用​​できます。

于 2012-11-28T12:26:33.113 に答える
1

「ランダム」の意味によって異なります。1から100までの乱数を生成し、生成された乱数が52である場合、現在の数+ 52を印刷し、現在の数+ 52の間のすべての数を印刷し、100万に達するまで繰り返し続けるなどの操作を行うことができます。

于 2012-11-28T11:26:03.100 に答える
0

さて、ここにあなたのリクエストの問題があります。

私が読んだことから、あなたはあなたがちょうど1,000,000回ループをするO(1)を手に入れたいようです。今、非常に良いランダムを持つことによってそれを行う唯一の方法は、戻ってそれを参照し、1,000,000のサイズの配列を作成することです。1つを印刷するときは、スポットがすでに1かそのようなものでない限り、その特定のスポット=1にします。しかし、あなたが言っていることから、あなたは今あなたのランダムを恐ろしくし、ほとんどランダムではない記録を残したくありません

本当にランダムなものは何もないのを見てください。パターンは常に存在しますが、特定の数学演算を使用すると、かなり認識できないパターンを作成できます。

あなたが使用しなければならないランダムの問題は、それが1,000,000回印刷された後にのみそれ自身を繰り返すことができるということです。

これは次のように行うことができます:

Example randomizing 20 numbers

1 3 5 7 9 11 13 15 17 19 2 4 6 8 10 12 14 16 18 20

Now all that is, is num = (num + 2) % 20

もちろん、違いを大きくすることもできますが、状況は同じです。これは、ハッシュマップがどのように機能するかによく似ている可能性があります。しかし、主に私は、レコードを保持してO(1)で印刷することでこれをどのように行うことができるかを指摘したかったのですが、それはまったく良いランダムではありません。

于 2012-11-28T12:16:11.893 に答える