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