我需要用Java编写程序,使用以下公式生成[0,1]范围内的随机数:
X i =(aX i-1 + b)mod m
假设a,b和amp;的任何固定的int值。 m和X 0 = 0.5(即i = 0)
我该怎么做?
我试过这样做,但显然是错的:
int a = 25173, b = 13849, m = 32768;
double X_[i];
for (int i = 1; i<100; i++)
X_[i] = (a*(X_[i]-1) + b) % m;
double X_[0] = 0.5;
double double = new double();
System.out.println [new double];
答案 0 :(得分:8)
以下是一些提示:
int a, d, m, x;
乘法为*
, mod 为%
。
好的,我会再给你一点提示。你只需要一个X,你不需要所有这些数组;因为你只使用整数,所以你不需要任何花车或双箭头。
重要的代码行将是
x = (a * x + b) % m ;
您不需要其他x
,因为x
右侧的=
是旧x
或 x I-1 子> 的;左侧的那个将是您的“新”x
,或 x i 。
现在,从那里开始,您需要编写Java包装器,使您可以创建方法,这意味着编写类。
答案 1 :(得分:4)
听起来像是作业......所以我不会在代码中给你一个解决方案。
无论如何,你需要一个linear congruential generator。
提示:您需要将该数学公式作为函数编写。
<强>步骤:强>
我的Java生锈了,所以我不能说我对此很有把握,但这些可能是错误的:
int a = 25173, b = 13849, m = 32768;
double X_[i];//You need to define a constant array or use perhaps a list, you can't use i without defining it
for (int i = 1; i<100; i++)
X_[i] = (a*(X_[i]-1) + b) % m;
double X_[0] = 0.5;
double double = new double(); //You can't name a variable double, also types like double, don't need to be newed (I think)
System.out.println [new double]; //println uses () not [], in Java I think all functions need to use (), its not implied
答案 2 :(得分:1)
编辑: Bongers:
[]是特殊符号,如果您打算将您的变量命名为“X_ [i]”则不起作用。如果你打算制作一个数组,那么你就太复杂了。
您需要弄清楚Y原始等式是Xi-1还是X(i-1),因为这会对您的编程产生巨大影响。 Xi - 1只比Xi少一个。 X(i-1)是前一个随机数。
尝试在线做一些初学java教程。 Here's一个好的起点。在继续解决问题之前,请真正尝试理解教程。
以这种方式思考你的问题。[假设公式是X(i-1)]要生成第3个随机数X3,你需要生成X2,需要X1,需要X0。但你有X0。所以对于任何Xi,从X0开始,生成X1,然后生成X2等。直到Xi。
您可能不需要像我最初建议的那样调查recursion。
答案 3 :(得分:1)
线性同余生成器基本上是一个表达式,它修改给定值以产生系列中的下一个值。它采取以下形式:
x i + 1 =(a 。 x i + b)mod m
正如你已经指明的那样(略有不同:我被教导总是把x i + 1 放在左边,我仍然害怕25年后我的数学老师:-),其中的值为a
,b
和m
经过精心挑选,可以提供合适的价值观。请注意,使用mod
运算符时,您总是会得到0
和m-1
之间的值。
另请注意,值往往是整数而不是浮点,因此,如果您要求的话,您需要0-0.999范围内的值...,则需要将积分值除以{{1得到那个。
解释了它是如何工作的,这是一个简单的Java程序,它使用你问题中m
,a
和b
的值来实现它:
m
这是输出,无论如何看起来都是随机的: - )。
public class myRnd {
// Linear congruential values for x(i+1) = (a * x(i) + b) % m.
final static int a = 25173;
final static int b = 13849;
final static int m = 32768;
// Current value for returning.
int x;
public myRnd() {
// Constructor simply sets value to half of m, equivalent to 0.5.
x = m / 2;
}
double next() {
// Calculate next value in sequence.
x = (a * x + b) % m;
// Return its 0-to-1 value.
return (double)x / m;
}
public static void main(String[] args) {
// Create a new myRnd instance.
myRnd r = new myRnd();
// Output 20 random numbers from it.
for (int i = 0; i < 20; i++) {
System.out.println (r.next());
}
}
}
答案 4 :(得分:0)
我首先创建一个包含a,b,m,最新x(初始化为0.5)的类,以及一个像getNextNumber()这样的方法。
答案 5 :(得分:0)
public class generate_random_numbers {
public static void main(String[] args) {
int a = 25173, b = 13849, m = 32768;
Double[] X_ = new Double[100];
X_[0] = 0.5;
for (int i = 1; i < 100; i++) {
X_[i] = (a * X_[i - 1] + b) % m;
X_[i] = X_[i] / m;
System.out.println("X_[" + i + "] = " + X_[i]);
}
}
}