【问题标题】:What is the most elegant way to pick a random value from a set defined in NS_OPTION in objective-c?从objective-c的NS_OPTION中定义的集合中选择随机值的最优雅的方法是什么?
【发布时间】:2013-11-05 02:04:41
【问题描述】:

我有一个这样定义的 NS_OPTION:

 typedef NS_OPTIONS(NSInteger, PermittedSize) {
  SmallSize = 1 << 0,
  MediumSize = 1 << 1,
  LargeSize = 1 << 2
 }; 

后来我设置了我需要的值:

 PermittedSize size = SmallSize | MediumSize;

我正在使用它为特定级别的游戏随机生成各种中小型对象(duh)。 选择要生成的对象大小的最佳方法是什么?意思是,我想为我生成的每个对象随机选择它是否是允许的 2 个选项之一(在这种情况下为小和中)。通常我会使用带有我需要的数字范围的 arc4random 函数 - 但在这种情况下,如何使用位来完成? (然后映射回 PermittedSize 类型的值?

【问题讨论】:

    标签: objective-c enums bitmask arc4random


    【解决方案1】:

    使用 arc4random 的结果来确定您想要执行的位移量。像这样的:

    int bitShiftAmount = arc4random_uniform(numberOfPermittedSizes);
    PermittedSize size = 1 << bitShiftAmount;
    

    【讨论】:

    • 谢谢!这有帮助,但现在我无法获得正确的值。我的大小定义如下:PermittedSize size = SmallSize | LargeSize; 然后,我将其添加到带有字符串键的规则哈希表中;我稍后检索该值,并将其解包如下:PermittedSize sizes = (PermittedSize) [self.rules getSizeRules]; int bitShiftAmount = arc4random_uniform(sizes); PermittedSize actualSize = 1 &lt;&lt; bitShiftAmount; 当我测试这些值时:if (actualSize & SmallSize) NSLog(@"small");等介质被退回 - 唯一不想要的。我做错了什么?
    • 你没有做错什么。我误解了你的问题。我想如果由我决定,我会将事情明确化并存储允许大小的数组而不是单个值。然后我会从数组中随机挑选一个元素。我知道它不使用您的位掩码,但它对我来说更有意义。像这样的东西:NSArray *sizes = [self.rules.getSizeRules]; int sizeIndex = arc4random_uniform([sizes count]); PermittedSize sizeToUse = [[sizes objectAtIndex:sizeIndex] intValue]; 其中尺寸元素是 PermittedSize 值之一的 NSNumbers。
    • 好的,谢谢乔纳森。这也是我的想法,但我认为,由于我是 Objective-c 的新手,可能没有想到一个漂亮而优雅的解决方案。
    【解决方案2】:

    您仍在使用整数。 SmallSize 是 1。MediumSize 是 2。而 LargeSize4

    所以从 1 到 3 中选择一个随机数。1 小,2 中等,3 两者兼有。

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

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

    【讨论】:

      猜你喜欢
      • 2010-11-03
      • 2010-09-13
      • 1970-01-01
      • 2019-11-22
      • 1970-01-01
      • 2010-11-04
      • 1970-01-01
      • 2011-03-22
      相关资源
      最近更新 更多