(int)(rand()/(1.0+RAND_MAX)*101); 跟(int)(101.0*rand()/(RAND_MAX+1.0));的意思是一样的吗?
------ 有点儿差别,前者不会溢出,且可能的误差更小。
BTW:
要想生成不重复数,最佳的办法就是洗牌算法,可以参考一下C++的 std::shuffle。
你的方法最大的问题是 --- 它不是计算机算法 --- 因为有很大几率一次rand就获得了新数,有较小几率需要两次,有更较小几率需要三次,有……。即使放宽到一亿次,它的概率也不是0。即,它不能保证在有限步骤内完成。
如果你觉得洗牌算法需要一个很大的记录区,而你需要的数据又比较少,那可以只记录已经获得了的随机数,下次遇到相同随机数,则顺次取后面未被获取的数。
比如 1 2 3 4 7 11 已经被获取过了,现在又来了个2,那就顺次取后面未被获取的数 5。
------ 有点儿差别,前者不会溢出,且可能的误差更小。
BTW:
要想生成不重复数,最佳的办法就是洗牌算法,可以参考一下C++的 std::shuffle。
你的方法最大的问题是 --- 它不是计算机算法 --- 因为有很大几率一次rand就获得了新数,有较小几率需要两次,有更较小几率需要三次,有……。即使放宽到一亿次,它的概率也不是0。即,它不能保证在有限步骤内完成。
如果你觉得洗牌算法需要一个很大的记录区,而你需要的数据又比较少,那可以只记录已经获得了的随机数,下次遇到相同随机数,则顺次取后面未被获取的数。
比如 1 2 3 4 7 11 已经被获取过了,现在又来了个2,那就顺次取后面未被获取的数 5。