c++随机函数

问个问题:我有一个数组共100个元素,第一次抽取10个随机数,第二次在剩下的90个再抽取10个随机数,第三次在剩下的80个里面再抽取10个随机数,依次类推?如何实现?

其实并不是在每取完十个元素后再考虑不会重复抽取的问题,而是要在每取完一个元素后就要考虑在下一次抽取中会不会再次抽到上一次已经被选中过的元素。
推荐通过交换法将抽到的元素与容器后几个元素交换位置,在接下来的抽取中逐渐缩小范围(排除那后几个元素),就不会重复抽取了。还有一种效率不高但便于理解的方法,就是每次将选中的元素从容器中删除(但不适用于容器为数组的情况)。

// 定义两个全局变量(当然封装成一个能随机提供元素的容器类会更好)
int allelem[100] = ...
int bound = 100; // 可供选择的下标范围

int get_one(void) // 没有针对容器元素取尽等情况进行错误判断处理
{
int idx = rand()%bound;
--bound; // 减小下次抽取的范围
int tmp = allelem[idx]; // 如果元素是个复杂的对象,建议在容器中存放指针,这样在容器中交换两个元素位置的代价就很小了
allelem[idx] = allelem[bound]; // 如果正好抽取到交换位置,即idx与bound值相等的情况,需要作特殊处理吗?
allelem[bound] = tmp;
return tmp;
}

// 在其它地方调用上面的函数
for (int i=0; i<10; ++i)
{
int elem = get_one();
...
}
// 再抽取十个元素
for (int j=0; j<10; ++j)
{
int elem = get_one();
...
}
// 再再抽取十个元素
for (int k=0; k<10; ++k)
{
int elem = get_one();
...
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2020-06-12
正常,rand()的结果是随机的,所以完全有可能重复啊。
就像丢色子一样,前后完全有可能重复。
要想没有重复的,只能自己手动去重(比如发现跟前面重复了,就丢弃,重新生成)
第2个回答  2020-03-28
是这样的,c++里的随机数是由一个种子按照固定的算法生成的随机数的序列,如果种子不变,那么随机数序列不变,你每次运行都是取到同一个随机数序列的第一个随机数,所以结果一样。
你可以使用srand(time(null));放在你的随机数函数前面,这句的意思是利用系统时间来作为种子,即种子是会改变的,那么每次的结果也就不一样了。
第3个回答  2020-06-16
1.0可以省略;
rand函数产生的随机数不是真正的随机数,rand函数其实是通过一个算法实现的,只要给出初值,再用过那个算法生成的;
用srand(
(unsigned)time(
NULL
)
)或srand(
(unsigned)time(
0
)来给出随机数的种子,就是用系统时间作为rand的初值(系统时间每时每刻都变,可看作随机数),用srand函数要包括在#include
头文件中
第4个回答  2020-09-14
可以用srand()来设置
随机数
的种子,否则你每次运行程序将得到同样的随机数序列,也就是说rand()函数产生的是
伪随机数

1.0当然可以省略,rand()函数产生的是0到RAND_MAX之间的随机数。
srand(
(unsigned)time(
NULL
)
);
这样来初始化一下,就可以用了
相似回答