Java 我想创建一个程序,以随机顺序打印1到1000000之间的数字。不得重复或遗漏任何编号

Java 我想创建一个程序,以随机顺序打印1到1000000之间的数字。不得重复或遗漏任何编号,java,Java,我想用Java编写一个程序,生成100万到100万之间的数字,不应该重复任何数字,也不应该遗漏任何数字。我不知道从哪里开始。我不能把我用过的所有数字都记录下来,那是不切实际的。如何执行此操作?将1到1000000之间的整数存储在数组列表中。查看列表并打印其内容。因此您需要: 输出数字1-1000000(含1-1000000) 按随机顺序 没有重复或重复 不记录输出的数字 这是一个令人沮丧的问题,答案是:你不能那样做 所以我将挑战这个问题的基础:一百万个数字,每个字节八位,即122k存储数字的位标

我想用Java编写一个程序,生成100万到100万之间的数字,不应该重复任何数字,也不应该遗漏任何数字。我不知道从哪里开始。我不能把我用过的所有数字都记录下来,那是不切实际的。如何执行此操作?

将1到1000000之间的整数存储在数组列表中。查看列表并打印其内容。

因此您需要:

输出数字1-1000000(含1-1000000) 按随机顺序 没有重复或重复 不记录输出的数字 这是一个令人沮丧的问题,答案是:你不能那样做

所以我将挑战这个问题的基础:一百万个数字,每个字节八位,即122k存储数字的位标志。除非你是在微控制器中运行,否则这不应该是个问题。所以,即使在一个相当有限的环境中,你也应该能够做一些事情,比如

但是,除非你能储存这些数字,否则你就是做不到


之所以将此命名为CW,是因为我只是总结了社区在评论中所说的话,并且因为除了你不能这样做之外,它只是说看看NPE的答案。

取决于你所说的“随机”是什么意思。您可以执行一些操作,例如生成1到100之间的随机数,然后说如果生成的随机数为52,则打印当前数+52,然后打印当前数+52之间的所有数字,并不断重复,直到达到100万。

好的,这就是您请求的问题所在

从我读到的,你似乎想要得到一个O1,你只需要做1000000次循环。现在,唯一的方法是使用一个非常好的随机数,返回并引用1000000大小的数组。当你把一个打印出来时,你只需要让那个特殊的点=1,除非这个点已经是1或者类似的东西。但是,从你所说的,你不想保留一个记录,这将使你的随机性变得可怕,甚至不是随机的

看,真的没有真正随机的东西。总有一个模式,但使用某些数学运算,您可以创建一个无法识别的模式

您必须使用的随机变量的问题是,它只有在打印1000000次后才能重复自身

可以这样做:

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

现在你当然可以让差别变大,但情况是一样的。这看起来很像散列映射的工作原理。但我主要想指出的是,持有一张唱片并用O1打印是如何做到这一点的,但这并不是一个很好的随机选择

一种方法是使用伪随机游走。一个简单的伪随机游动使用任何大的素数来确保它没有带限制和模量的公共因子来包装该值,这样它在重复之前会取所有N个值

下面是一个较小的示例,使用100作为极限,47作为素数。您可以将其更改为使用1000000作为限制,并使用更大的素数,如513239

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

四十八 95 42 89 36 83 30 77 24 71 18 65 12 59 6. 53 100 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 一,


要使其看起来更随机,您可以使用两个伪随机游动的组合。

您尝试过什么?哪一部分给你带来了麻烦?你认为你应该怎么做?你试过什么?唯一不必记住打印的数字的方法是预生成所有数字并删除打印的数字。我不能保存我使用过的所有数字的记录,那是不现实的,让我们看看,一百万个数字,每字节8位,这是122k来存储数字的位标志。除非你是在微控制器上运行,否则这应该不会是个问题。注意OP上说的:我不能记录我使用过的所有数字他说他不能保存这些记录,但如果没有更多,我就不相信了evidence@T.J.Crowder当前位置他说这不现实。不幸的是,没有这些,他就无法解决他的问题。@igrimpe:我不太确定是否有加密技巧可用,但我不是一个密码学家。虽然我们谈论的是所有的数字,1到1000000,但我并不乐观。我已经使用了随机的,定义的MIN MAX分别为1和100万,但是它重复和忽略了一些数字。让我们考虑一下你的位图方法。在步骤n中,您建议如何生成一个不同于之前n-1个数字的随机数?如果你知道一种比^2整体算法更好的方法,我很想听听。@NPE:我没说它会很快。:-我认为这个要求是愚蠢的,应该放弃。没有它,你的方法显然是最好的方法。不是我的
顺便说一句,否决票;我认为你的答案是有用的,尽管它与要求相矛盾。我还认为这个问题是在浪费时间。因为我没说会很快。这种方法节省内存,而不是时间。如果OP关注内存,它将是最好的解决方案。+1路酷。可能不是非常随机的,但在某些情况下已经足够好了?至少,如果你的极限是2的幂,它是便宜的esp,因为你可以用&n-1替换%n