随机数发生器

时间:2009-03-16 01:41:35

标签: java random

我需要用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];

6 个答案:

答案 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

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

<强>步骤:

  1. 上课。
  2. 将所需的状态添加为该类的成员。
  3. 在课堂上创建一个功能。是否需要输入。
  4. 用Java编写同余生成器的公式(用Java查找数学运算)。
  5. 返回结果。
  6. 我的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:

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

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

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

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

  5. 您可能需要像我最初建议的那样调查recursion

答案 3 :(得分:1)

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

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

正如你已经指明的那样(略有不同:我被教导总是把x i + 1 放在左边,我仍然害怕25年后我的数学老师:-),其中的值为abm经过精心挑选,可以提供合适的价值观。请注意,使用mod运算符时,您总是会得到0m-1之间的值。

另请注意,值往往是整数而不是浮点,因此,如果您要求的话,您需要0-0.999范围内的值...,则需要将积分值除以{{1得到那个。

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

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