拾取随机二进制标志



我定义了以下内容:

typdef enum {
  none = 0,
  alpha = 1,
  beta = 2,
  delta = 4
  gamma = 8
  omega = 16,
} Greek;
Greek t = beta | delta | gammax

我希望能够随机选择t中设置的标志之一。t的值可以变化(可以是枚举中的任何值)。

我的一个想法是这样的:

r = 0;
while ( !t & ( 2 << r ) { r = rand(0,4); }

有人有更优雅的想法吗?

如果有帮助的话,我想在ObjC中这样做。。。

假设我已经正确理解了您的意图,如果您对"优雅"的定义包括表查找,那么以下内容应该可以非常有效地完成任务。我已经写了足够多的文章来展示它是如何工作的,但没有填写完整的表格。此外,对于Objective-C,我建议使用arc4random而不是rand

首先,构造一个数组,其索引是可能的t值,其元素是t的底层Greek值的数组。我忽略了none,但如果你想要的话,这是一个微不足道的添加。我还发现指定子数组的长度最容易。或者,你可以用NSArray来做这件事,并让它们自我报告自己的长度:

int myArray[8][4] = {
    {0},
    {1},
    {2},
    {1,2},
    {4},
    {4,1},
    {4,2},
    {4,2,1}
};
int length[] = {1,1,1,2,1,2,2,3};

然后,对于任何给定的t,您可以使用随机选择其元素之一

int r = myArray[t][arc4random_uniform(length[t])];

一旦你通过了设置,实际的随机选择是有效的,不涉及接受/拒绝循环。

最新更新