不是一个新问题,而是仅针对c / c ++。
For ex- range[1...10] exclude_set [2,5,7,9]
自定义rand函数应该以相同的概率返回剩余数字。
我试过的是 -
1)通过rand()%10函数生成数字。
2)检查exclude_Set中是否存在值。如果在循环中再次出现调用rand()
采访者说它的蛮力方法。我很好奇,c / c ++存在任何好的算法
SO / / p>上的Java / C#/ PHP已经回答了这个问题
How can I generate a random number within a range but exclude some?
How to get a random value from 1~N but excluding several specific values in PHP?
How to get a random number from a range, excluding some values
PS - 我已经尝试过googling.Even Bing
答案 0 :(得分:4)
一种简单的方法是将剩余的值映射到数组并使用int[6] rvec = {1, 3, 4, 6, 8, 10};
// and get numbers with
rvec[rand() % 6];
来访问它们,例如:
.dots
答案 1 :(得分:1)
对于小型设备,例如64位,您可以使用带有排除(或包含)值的位图:
#define MAX_RANDVAL 10
uint64_t illegal_values = (1ULL<<2) | (1ULL<<5) | ... ;
int rand_val;
do {
rand_val = rand();
} while ( (rand_val > MAX_RANDVAL) || (illegal_values & (UINT64_C(1) << rand_val) );
但是,要获得均匀分布的值,必须在遇到非法值时循环。
增强功能可能包括利用序列中的规律性。可以使用散列算法或甚至二叉搜索树来扩展范围。最优算法在很大程度上取决于实际要求。没有一种最佳算法。