随机数发生器

我需要用Java编写一个程序,使用以下公式生成[0,1]范围内的随机数:

X i =(aX i-1 + b)mod m

假设a,b&m和X 0 = 0.5(即i = 0)的任何固定int值

我该怎么做呢?

我试过这样做,但显然是错的:

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]; 

以下是一些提示:

 int a, d, m, x; 

乘法是*mod%

更新

好的,我会再给你一点提示。 你只需要一个X,你不需要所有这些数组; 因为你只使用整数,所以你不需要任何花车或双箭头。

重要的代码行将是

 x = (a * x + b) % m ; 

你不需要另外一个x ,因为=右边的x是OLD xx i-1 ; 左侧的那个将是你的“新” xx i

现在,从那里开始,你需要编写Java包装器,让你创建一个方法 ,这意味着编写一个

听起来像家庭作业……所以我不会给你一个代码解决方案。

无论如何,你需要一个线性同余发生器 。

提示:您需要将该数学公式作为函数编写。

脚步:

  1. 上课。
  2. 将所需状态作为成员添加到类中。
  3. 在课堂上创造一个function。 是否需要输入。
  4. 在Java中编写同余生成器的公式(在Java中查找数学运算)。
  5. 返回结果。

我的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 

编辑:Bongers:

  1. []是特殊符号,如果您打算将您的变量命名为“X_ [i]”,则该符号将不起作用。 如果你打算制作一个数组,那么你就太复杂了。

  2. 您需要弄清楚Y原始方程是Xi-1还是X(i-1),因为这会对您的编程产生巨大影响。 Xi – 1只比Xi少一个。 X(i-1)是先前的随机数。

  3. 尝试在线做一些初学java教程。 这是一个很好的起点。 在继续解决您的问题之前,请真正尝试理解这些教程。

  4. 以这种方式考虑你的问题。[假设公式为X(i-1)]要生成第3个随机数X3,你需要生成X2,需要X1,需要X0。 但你有X0。 所以对于任何Xi,从X0开始,生成X1,然后生成X2等。直到Xi。

您可能不需要像我最初建议的那样研究递归 。

线性同余生成器基本上是一个表达式,它修改给定值以产生系列中的下一个值。 它采取以下forms:

x i + 1 =(a。x i + b)mod m

正如你已经指明的那样(略有不同:我被教导总是把x i + 1放在左边,我仍然害怕25年后我的数学老师:-),其中abm被仔细选择给出一系列不错的价值观。 请注意,使用mod运算符,您将始终以0m-1包括0m-1之间的值结束。

还要注意,值往往是整数而不是浮点,因此,如果您要求,您需要一个0-0.999范围内的值…,您需要将积分值除以m得到它。

解释了它是如何工作的,这是一个简单的Java程序,它使用你问题中abm值来实现它:

 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()); } } } 

这是输出,无论如何看起来随机:-)。

 0.922637939453125 0.98748779296875 0.452850341796875 0.0242919921875 0.924957275390625 0.37213134765625 0.085052490234375 0.448974609375 0.460479736328125 0.07904052734375 0.109832763671875 0.2427978515625 0.372955322265625 0.82696533203125 0.620941162109375 0.37451171875 0.006134033203125 0.83465576171875 0.212127685546875 0.3128662109375 

我将首先创建一个包含a,b,m,最新x(初始化为0.5)和getNextNumber()之类的方法的类。

 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]); } } }