代码之家  ›  专栏  ›  技术社区  › 

随机数发生器

  •  3
  •  · 技术社区  · 7 年前

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

    =(最大值 i-1型 +b)模块m

    假设a、b&m和X的任何固定int值 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 回复  |  直到 13 年前
        1
  •  8
  •   Charlie Martin    17 年前

    以下是一些提示:

    int a, d, m, x;
    

    乘法是 * 国防部 % .

    更新

    好吧,我再给你点提示。您只需要一个X,不需要所有这些数组;因为您只使用整数,所以不需要任何浮点或双字节。

    重要的代码行是

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

    你不需要另一个 x 因为 = 是旧的吗 ,或 i-1型 ;左边的那个就是你的“新的” ,或 .

    现在,从这里开始,您需要编写Java包装器,它将使 方法 ,意思是写一个 .

        2
  •  4
  •   Robert Gould    17 年前

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

    无论如何你需要一个 linear congruential generator .

    提示: 你需要把那个数学公式写成一个函数。

    步骤:

    1. 上课。
    2. 将所需状态作为成员添加到类中。
    3. 在类中生成函数。根据需要输入。
    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
    
        3
  •  1
  •   Perchik    17 年前

    编辑: 博格斯:

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

    2. 你需要弄清楚它们的原始方程是X i-1还是X(i-1),因为这对你的编程有很大的影响。十一一比十一少一个。X(i-1)是先前的随机数。

    3. 尝试在网上做一些初级java教程。 Here's 一个好的开始。在继续讨论你的问题之前,一定要先理解教程。

    4. 这样想你的问题。[假设方程是X(i-1)]要生成第三个随机数X3,你需要生成X2,它需要X1,它需要X0。但你有X0。所以对于任何Xi,从X0开始,生成X1,然后生成X2,等等。。直到十一岁。

    你可能会 不要 需要调查 recursion 就像我第一次建议的那样。

        4
  •  1
  •   paxdiablo    17 年前

    线性同余生成器基本上是修改给定值以生成序列中下一个值的表达式。形式如下:

    i+1 =(一) . +b)模块m

    正如你已经指出的(略有不同:我被教导总是把x i+1 在左边,25年后我仍然害怕我的数学老师,因为 a , b m 是精心挑选出来的,给人一个像样的价值范围。请注意,使用 mod 接线员,你总是得到一个介于 0 m-1 包容的。

    还要注意的是,这些值往往是整数,而不是浮点,因此如果您需要一个0-0.999…范围内的值,则需要将整数值除以 为了得到这个。

    在解释了它的工作原理之后,这里有一个简单的Java程序,它使用 , 从你的问题:

    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
    
        5
  •  0
  •   Can Berk Güder Pugalmuni    17 年前

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

        6
  •  0
  •   BigGinDaHouse    13 年前
    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]);
            }
        }
    }
    
    推荐文章