(求大神)指定范围的伪随机数!

JDCeed 发布于 2014/11/13 08:11
阅读 175
收藏 0
有一个算法是可以算出java里的random给出的数的方法。
Xn+1 = (aXn + c) mod m
Xn 是第n个数字的意思  (seed 值是1)
现在   a=1103515245 c =12345
m =2147483648

然后要打印出范围40--100的10个随机数。

现在打印结果是:

在【40,100】里产生的10个随机数是

 54, 44, 76, 63, 65, 63, 70, 93, 40, 52

 问题来了,怎么写。苦恼


加载中
0
JDCeed
JDCeed
求大神啊!我不太理解这伪随机数~
0
不日小鸡
你跪求我也不告诉你
JDCeed
JDCeed
你好坏~~-_-
0
_
_Yud
(rand mod (100-40))+40
JDCeed
JDCeed
你这个怎么看起来像C。。。。我说java。。
0
_
_Yud

改m值不就可以了? 之后再加上基数(base)

0
JDCeed
JDCeed

引用来自“_Yud”的评论

改m值不就可以了? 之后再加上基数(base)

我还是我太明白,特别是seed值。

话说我自己还写了我想的步骤-_--_--_-

一个方法叫做getRandomPositiveInt(),返回int类型,做所有关于long类型常量的计算, 把结果转成int类型
第二个方法getRandom方法,有两个参数,一个是最大值,一个是最小值。这个方法要调用第一个方法,最后返回最小值到最大值里的一个随机数
第三个方法printRandomSamples,三个参数,一个int表示多少个数产生,其他两个int表示最大值和最小值,然后打印
main方法调用printRandomSamples方法去显示10个在40-100范围里的随机数
0
timlentse
timlentse
题主的意思是不是想生成的随机数指定是54 44 76...
JDCeed
JDCeed
对啊,通过上面的那个公式和数值,在40-100里就是54 44 76.。。。。
0
k
kchr

随机数生成算法,本身会给出值域的范围 [1, MAX] 啊。对于你的这个 LCG 线性同余算法,MAX 就是 m,即 2147483648.

用 LCG 算法,那就是要求低的场合了,可以直接 v = ((100 - 40)/MAX)*Xn。注意运算过程选择合适的精度,最后转换成整数。

JDCeed
JDCeed
恩谢谢啦。不过我还是还写。。
0
vvtf
vvtf
new Random().nextInt(60) + 40;
0
我的名子
我的名子

@Test

public void range() throws Exception {

try {

List<Object> ints = new ArrayList<Object>();

int min = 40;

int max = 100;

Random rd = new Random();

for (int i = 0; i < 100; i++) {

int r;

do {

r = rd.nextInt((max - min) + 1) + min; // 40~100

} while (r == max || r == min);

ints.add(r);

}

logger.info("{}", gson.toJson(ints));

} catch (Exception e) {

throw e;

}

}

我的名子
我的名子
回复 @JDCeed : jdk源码中的类似的实现。可以去看看〜
JDCeed
JDCeed
这个太高端了都看不懂。。
返回顶部
顶部