已知一个函数random(),可以返回1到n是随机值,设法利用它他构造一个random2(),使得random2()可以返回1到m的随机值
从MITBBS看来的解决方法,使用笛卡尔积,构造(n*n)个随机元素,所以这些元素产生的概率都是1/(n*n)。
当 m<=n*n 时,只需要略去((n*n) % m)个元素,其余的元素总个数可以整除m,就构造了符合要求的random2()了;
当 m > n*n 时,可以考虑n*n*n来构造元素,然后略去((n*n*n) % m)个元素,其余的元素总个数就可以整除m,那就构造了random2()了。
例如,假设n=2,笛卡尔积就是 (1, 1)、(1, 2)、(2, 1)、(2, 2),就得到(2*2)个元素,并且出现这(2*2)个元素出现的概率是相等的,都是1/4 。
假设此时m=3, (2*2) 不能 整除3,所以随便略去((2*2) % 3) (也就是 1 个) 个元素即可构造一个random2()函数。
依此类推...