生成一个范围内的随机数,但在C / C ++

时间:2015-11-28 14:49:11

标签: c algorithm

不是一个新问题,而是仅针对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

2 个答案:

答案 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) );

但是,要获得均匀分布的值,必须在遇到非法值时循环。

增强功能可能包括利用序列中的规律性。可以使用散列算法或甚至二叉搜索树来扩展范围。最优算法在很大程度上取决于实际要求。没有一种最佳算法。