采摘随机二进制标志

时间:2014-11-05 23:35:25

标签: objective-c random enums binary

我定义了以下内容:

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中这样做......

1 个答案:

答案 0 :(得分:1)

假设我已正确理解你的意图,如果你对'#34;优雅&#34;的定义包括表查找以下应该非常有效地完成这个技巧。我写得足以说明它是如何运作的,但没有填写整个表格。另外,对于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])];

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