首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >随机逻辑引擎实现思想

随机逻辑引擎实现思想
EN

Stack Overflow用户
提问于 2014-07-10 08:45:50
回答 2查看 72关注 0票数 1

我试图为这个场景找到一个有效的随机逻辑算法。哪种编程语言并不重要:假设我有20个元素数组填充了数字

代码语言:javascript
复制
[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]

从这一点出发,我需要构造每次15大小的数组,但是每次我设置这个新数组中的数字时,剩余的插槽将被来自主数组的随机数填充。例如:在新数组中,必须包含的数字为:1,11,13,20,8,9

因此,新的数组是:

代码语言:javascript
复制
[1,N,N,11,N,20,8,N,9,N,N,N,13,N,N]

其中Ns是主数组所有20个元素的随机数。

另一个示例:给定2,18,17,9,5创建新的10个元素数组:

代码语言:javascript
复制
[2,2,18,2,11,17,20,5,5,9]

没有重复元素的问题

我想找出一些好的算法。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-10 12:01:30

如果您想一次接收一个随机数,并且不想预先创建完整的result数组,那么我的另一个答案是:

  1. 获取一个从0.requested_number范围内的随机数(其中requested_number是要获取的元素总数)。
  2. 如果该索引介于0和length(required)之间,则从数组required中打印它,然后从数组中删除它;
  3. 。。否则,下一个索引是> length(required),因此从optional数组中选择任意随机数。
  4. 减少requested_number并重复,直到达到0为止。

您需要对2调用random;第一个从total_number - required_number中选择索引,因此您知道从哪个数组中选择一个值,第二次调用optional,以从整个可用范围内选择一个随机数。

这里是C中的一个基本实现(脚注:在mod上使用rand()不能产生一个很好的随机数,但这个示例可以这样做)。

代码语言:javascript
复制
int main()
{
    int optional[] = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20 };
    int required[] = { 21,22,23,24,25 };
    int requested_number = 15;

    int take_from_required, optional_size, next;

    srand(time(NULL));

    if (requested_number < sizeof(required)/sizeof(required[0]))
    {
        printf ("requested number of elements must be at least as large as required array\n");
        return EDOM;
    }

/*  Use this much from 'required': */
    take_from_required = sizeof(required)/sizeof(required[0]);
/*  Use this much from 'optional': */
    optional_size = sizeof(optional)/sizeof(optional[0]);

    while (requested_number > 0)
    {
        /* Please note this is a fairly bad 'random'!
            As discussed many times before on SO. */
        next = rand() % requested_number;

        /* Take from which array? */
        if (next >= take_from_required)
        {
            printf ("%d\n", optional[rand() % optional_size]);
        } else
        {
            printf ("%d (required)\n", required[next]);
            required[next] = required[take_from_required-1];
            take_from_required--;
        }
        requested_number--;
    }

    return 0;
}
票数 1
EN

Stack Overflow用户

发布于 2014-07-10 10:09:01

如果我理解正确,这就是问题所在:

代码语言:javascript
复制
optional [ 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20 ]
required [ 2,18,17,9,5 ]

现在构建一个包含至少所有required元素的新数组,并将从optional获取的元素填充到它的容量中。

问题似乎是,您需要从requiredoptional中取出随机数,同时确保required在末尾是空的。*

创建一个新的数组result (至少需要和required一样长-然后,可以从这个问题中推断出来)。将required的所有元素复制到其中;从optional中用随机元素填充其余元素。

此时,您满足了主要条件,但是required的元素总是首先出现。因此,作为最后一步,对现在存储在result数组中的元素进行洗牌(例如,使用众所周知的费舍-耶茨洗牌)。

*“空”,因为required中的所有数字必须至少使用一次。将它们“从数组中删除”是确保这种情况发生的最简单方法。当(a)可能有任何数字的重复(来自optionalrequired) (b)是,而不是optional的子集时,事情就变得复杂起来了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24672084

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档