【问题标题】:generate a random number within a range but exclude some in C/C++生成一个范围内的随机数,但在 C/C++ 中排除一些
【发布时间】:2015-11-28 14:49:11
【问题描述】:

不是一个新问题,但它只针对 c/c++ 。

For ex- range[1...10] exclude_set [2,5,7,9] 

自定义 rand 函数应该以相等的概率返回剩余的数字。

我试过的是-

1) 通过 rand() %10 函数生成数字。

2) 检查 exclude_Set 中是否存在值。如果存在则在循环中再次调用 rand()

面试官说它的蛮力方法。我很好奇c/c++有什么好的算法

Java/C#/PHP on SO 上的问题已经得到解答

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- 我已经尝试过谷歌搜索。甚至 Bing

【问题讨论】:

  • C/C++ 不是一门语言,请选择一个!
  • @πάνταῥεῖ 好吧,在 C 中说吧。我更专注于算法。
  • 我不知道为什么对这个问题投反对票??
  • 如果您只是对算法感兴趣,请删除语言标签。
  • Shan, @NathanOliver:抱歉,我忽略了这一点。

标签: c algorithm


【解决方案1】:

一种直接的方法是将剩余的值映射到一个数组并使用rand() 来访问它们,例如:

int[6] rvec = {1, 3, 4, 6, 8, 10};
// and get numbers with
rvec[rand() % 6];

【讨论】:

  • 在向量/数组中包含所有允许的值非常浪费空间,并且对于大型集合来说是不可接受的。这也不会均匀分布随机值。
  • @Olaf OP 从 C/C++ 更改为 C。相应地编辑了答案。
【解决方案2】:

对于小型设备,例如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) );

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

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

【讨论】:

  • while() 表达式始终为假,因为如果 rand_val 大于 MAX_RANDVAL,则非法值 & (1ULL
  • @Ctx:谢谢,已编辑。还修正了面具的一个小缺陷(非关键)。
猜你喜欢
  • 2011-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-08
  • 1970-01-01
  • 2013-04-04
  • 2011-04-27
相关资源
最近更新 更多