如何使用用户提供的值生成0到9之间的1000个随机数?
程序需要允许用户选择事实值, 常数,模数和起始种子数。
它应该使用这些值在0到9之间生成1000个随机数。
存储在数组中生成每个数字的次数。
在最后输出数字的分布。
这是我到目前为止所做的事情,但到目前为止,我只是让用户输入信息,所以,我距离第2,3和4号还很远。
public static void main(String[] args) {
int fact;
int constant;
int modulus;
int seednumber;
Scanner scan = new Scanner(System.in);
System.out.println("Input Fact: ");
fact = scan.nextInt();
System.out.println("Input Const: ");
constant = scan.nextInt();
System.out.println("Input M: ");
modulus = scan.nextInt();
System.out.println("Input Seed: ");
seednumber = scan.nextInt();
int [] arrayBox;
arrayBox = new int [10];
for (int i=0; i<10; i++){
arrayBox[i]=0;
}
int noOfNumberGenerated=0;
while (noOfNumberGenerated<1000){
seednumber=(((fact*seednumber)+constant)%modulus);
}
答案 0 :(得分:1)
首先不需要这部分:
for (int i=0; i<10; i++){
arrayBox[i]=0;
}
默认情况下,数组将填充为0
。第2部分和第3部分:
Random randomGenerator = new Random(seed);
for (int idx = 0; idx < 1000; idx++){
int randomInt = randomGenerator.nextInt(10);
arrayBox[randomInt] = arrayBox[randomInt] + 1
}
第4部分:
for(int i =0; i< 10; i++){
System.out.println("amount of "+i+" is "+arrayBox[i]);
}
- edit-- 作为对您的评论的回应,Java中的Random类本身就是LGC的一个实现,被认为是更好的一个。常量被硬编码为
fact = 25214903917
constant = 11
这些数字经过大量测试后被选中,我相信你可以在互联网上找到很多关于它的文档。
在您的情况下,您有2个选项。强制Random
使用您的常量或自己编写。选项1将为您提供一个较弱的随机类版本,但它仍然会更强大&#39;然后选择2。
1:
public class RandomCustom extends Random{
//You have to Override this aswell.
@Override
synchronized public void setSeed(long seed) {
this.seed.set(initialScramble(seed));
haveNextNextGaussian = false;
}
@Override
protected int next(int bits){
long oldseed, nextseed;
AtomicLong seed = this.seed;
do {
oldseed = seed.get();
nextseed = (oldseed * fact + constant) & modulus;
} while (!seed.compareAndSet(oldseed, nextseed));
return (int)(nextseed >>> (48 - bits));
}
}
之后只需更改Random
顶部代码中的RandomCustom
即可。
在我看来,为什么要尝试重新发明轮子,而不是使用已被证明是坚固且有效的东西
答案 1 :(得分:1)
如果您计划使用Random类,则不需要所有这些输入参数。你所需要的只是一个长种子和用于生成的模数(如果需要的话代数):
$file_content = file_get_contents($file_path); // Read the file's contents
if(file_exists($file_path)){
unlink($file_path);
}
force_download($filename, $file_content);