从objective-c的NS_选项中定义的集合中选择随机值的最优雅方式是什么?

从objective-c的NS_选项中定义的集合中选择随机值的最优雅方式是什么?,objective-c,enums,bitmask,arc4random,Objective C,Enums,Bitmask,Arc4random,我有一个NS_选项,我将其定义为: typedef NS_OPTIONS(NSInteger, PermittedSize) { SmallSize = 1 << 0, MediumSize = 1 << 1, LargeSize = 1 << 2 }; 我用它为游戏的特定关卡随机生成各种中小型对象(duh)。 选择要生成的对象大小的最佳方法是什么?也就是说,我想为我生成的每个对象随机选择它是否是允许的两个选项之一(本例中为小型和中型)。通

我有一个NS_选项,我将其定义为:

 typedef NS_OPTIONS(NSInteger, PermittedSize) {
  SmallSize = 1 << 0,
  MediumSize = 1 << 1,
  LargeSize = 1 << 2
 }; 
我用它为游戏的特定关卡随机生成各种中小型对象(duh)。
选择要生成的对象大小的最佳方法是什么?也就是说,我想为我生成的每个对象随机选择它是否是允许的两个选项之一(本例中为小型和中型)。通常情况下,我会使用arc4random函数来表示所需的数字范围——但在这种情况下,如何使用位来实现呢?(然后映射回PermittedSize类型的值?

您仍在使用整数。
SmallSize
为1。
MediumSize
为2。
LargeSize
4

从1到3中选择一个随机数。1是小的,2是中等的,3是两者

一旦你有了一个随机数,分配它

NSInteger val = arc4random_uniform(3) + 1; // give 1-3
PermittedSize size = (PermittedSize)val;

使用arc4random的结果来确定要执行的位移位量。类似如下:

int bitShiftAmount = arc4random_uniform(numberOfPermittedSizes);
PermittedSize size = 1 << bitShiftAmount;
int bitShiftAmount=arc4random\u统一(numberOfPermittedSizes);

PermittedSize size=1谢谢!这很有帮助,但现在我很难获得正确的值。我的大小定义如下:
PermittedSize size=SmallSize | LargeSize;
然后,我用字符串键将其添加到规则哈希表中;稍后检索该值,并按如下方式将其展开:
PermittedSize size=(PermittedSize)[self.rules getsizeroles];int-bitShiftAmount=arc4random_-uniform(大小);PermittedSize actualSize=1您没有做错任何事。我误解了您的问题。我想如果由我决定,我会将事情明确化,并存储一个允许大小的数组,而不是单个值。然后我会从数组中随机选取一个元素。我知道它不使用您的位掩码,但它对我来说更有意义。类似于这样的内容:
NSArray*size=[self.rules.getSizeRules];int-sizeIndex=arc4random\u-uniform([size count]);PermittedSize-sizeToUse=[[size-objectAtIndex:sizeIndex]intValue]
其中大小元素是PermittedSize值之一的NSNumber。好的,谢谢你Jonathan。这也是我的想法,但我想既然我是objective-c的新手,可能会有一个漂亮而优雅的解决方案没有想到。
int bitShiftAmount = arc4random_uniform(numberOfPermittedSizes);
PermittedSize size = 1 << bitShiftAmount;