【问题标题】:Picking random binary flag选择随机二进制标志
【发布时间】:2014-11-05 23:35:24
【问题描述】:

我已经定义了以下内容:

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 中执行此操作...

【问题讨论】:

  • 在这种情况下,您对“更优雅”的看法是什么?我可以想到一个只生成一个随机数但需要多几行代码才能工作的解决方案。
  • 另外,根据您想要的“随机”程度,您可以使用内置编译器找到最低或最高设置位:Finding position of 1s efficiently in an bit array
  • @rmaddy 更优雅,我的意思是不需要while循环。我的例子有点“朝墙上开火,看看有什么棒”。如果t = delta 并且我们从那个随机“集合”(1 个)中挑选,那么随机每次都会错过的机会有五分之五直到它从集合中选择“活动”的一个。 @JoshCaswell 是否只选择最高/最低设置位?

标签: objective-c random enums binary


【解决方案1】:

假设我已正确理解您的意图,如果您对“优雅”的定义包括表查找,那么以下内容应该可以非常有效地解决问题。我已经写了足够多的东西来展示它是如何工作的,但没有填写整个表格。此外,对于 Objective-C,我建议使用 arc4random 而不是使用 rand

首先,构造一个数组,其索引是可能的t 值,其元素是t 的底层Greek 值的数组。我忽略了none,但如果你想要的话,这是一个微不足道的补充。我还发现最容易指定子数组的长度。或者,您可以使用 NSArrays 执行此操作,并让他们自行报告其长度:

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])];

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

【讨论】:

    猜你喜欢
    • 2011-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-23
    • 1970-01-01
    • 2018-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多