我有一个函数getrand100()
,它返回0-100
编写一个代码片段,以随机顺序打印1-200号,但没有重复。您可以在任意时间调用getrand100()来获取1到100之间的随机数。
请帮忙怎么做?
答案 0 :(得分: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 :(得分:2)
将getrand200()
定义为getrand100() + getrand100()
,因为您不需要统一分布。构建数字1-200的数组。使用getrand200
实现Fisher–Yates shuffle算法的偏斜版本。