我定义了以下内容:
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中这样做......
答案 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])];
一旦通过设置,实际的随机选择是有效的,不涉及接受/拒绝循环。