2011-12-26 228 views
-3

我有一个函数getrand100()返回从0-100打印200随机数

随机数写一段代码,打印数1-200以随机顺序有没有的他们重复。你可以调用getrand100()任意数量的时间从1到100得到随机数。

请帮忙怎么做?

+0

您已经定义了C和Java - 那么,哪一个? – fge 2011-12-26 22:43:31

+1

这是功课吗? – PeeHaa 2011-12-26 22:44:07

+0

是家庭作业acually我正在寻找逻辑,所以我会实现在任何语言。 – 2011-12-26 22:45:57

回答

4

创建一个数字从0到200的数组。然后,使用Fisher-Yates Shuffle来混洗它们。

由于您getrand100功能只提供数字从0到100,写的是这样的:

int rnd = getrand100(); 
int scale = getrand100(); 
if (scale >= 50) 
    rnd += 100; 

这会给你的随机数从0到200

其实,这是一个有点复杂因为随机数字的范围发生了变化。也就是说,首先你想生成一个从0到200的随机数。下一次,从0到199,然后是198,197等。所以你需要一种方法来扩展你的随机数。类似以下内容将使您相当接近均匀分布:

int rnd = getrand100(); 
double frnd = rnd/100.0; 
int realRnd = round(frnd * range); 

这假定您具有舍入功能。 range是您的范围的顶部。所以第一个电话,range是200,然后199等

这不会给你完美的统一分配,因为你只会使用两个有效数字,但它会给一个课堂上可以接受的结果分配。

+1

复制品呢? – Hogan 2011-12-26 23:05:34

+1

@Hogan:重复并不是Fisher-Yates Shuffle的问题。数组被混洗,然后输出。阅读维基百科文章。 – 2011-12-26 23:33:36

+1

的要求。 OP说不能有重复,你的回答并不能解决这个问题。 – Hogan 2011-12-27 04:31:50

2

定义getrand200()getrand100() + getrand100(),因为你没有统一分布的要求。建立数字1-200的数组。使用getrand200实现Fisher–Yates shuffle算法的倾斜版本。