9
回答
(求大神)指定范围的伪随机数!
华为云4核8G,高性能云服务器,免费试用   
有一个算法是可以算出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

 问题来了,怎么写。苦恼


<无标签>
举报
JDCeed
发帖于4年前 9回/175阅
共有9个答案 最后回答: 4年前

引用来自“_Yud”的评论

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

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

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

一个方法叫做getRandomPositiveInt(),返回int类型,做所有关于long类型常量的计算, 把结果转成int类型
第二个方法getRandom方法,有两个参数,一个是最大值,一个是最小值。这个方法要调用第一个方法,最后返回最小值到最大值里的一个随机数
第三个方法printRandomSamples,三个参数,一个int表示多少个数产生,其他两个int表示最大值和最小值,然后打印
main方法调用printRandomSamples方法去显示10个在40-100范围里的随机数

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

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

--- 共有 1 条评论 ---
JDCeed恩谢谢啦。不过我还是还写。。 4年前 回复

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

}

}

--- 共有 2 条评论 ---
我的名子回复 @JDCeed : jdk源码中的类似的实现。可以去看看〜 4年前 回复
JDCeed这个太高端了都看不懂。。 4年前 回复
顶部