随机逻辑引擎实现思路

时间:2014-07-10 08:45:51

标签: algorithm random

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

[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]

由此我需要构建每次15个大小的数组BUT 每次我设置必须在这个新数组中的数字,其余的插槽将填充来自主数组的随机数。 例如: 在新数组中,必须包含的数字为:1,11,13,20,8,9
所以新数组将是:

[1,N,N,11,N,20,8,N,9,N,N,N,13,N,N]

N s是Master数组的所有20个元素的随机数。

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

[2,2,18,2,11,17,20,5,5,9]

重复元素没问题

我试图为此找到一些好的算法。

2 个答案:

答案 0 :(得分:1)

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

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数组中的元素进行随机播放(例如,使用众所周知的Fisher-Yates shuffle)。


[*]'清空',因为required 中的所有数字必须至少使用一次。把他们带走" out"数组是确保这种情况发生的最简单方法。当(a)你可能有任何数字的重复时(从optionalrequired(b){ {1}} 不是required的子集

答案 1 :(得分:1)

如果您希望一次收到一个随机数并且不想预先创建完整的result阵列,那么另一个答案是:

  1. 获取0到requested_number之间的随机数(其中requested_number是要获取的元素总数)。
  2. 如果此索引介于0和length(required)之间,请从数组required打印;然后从数组中删除;
  3. ..否则下一个索引是> length(required)然后从optional数组中选择任意随机数。
  4. 减少requested_number并重复直至达到0.
  5. 您需要 2 来电random;第一个从total_number - required_number中选择一个索引,因此您知道从哪个数组中选择一个值,以及第二次optional,从整个可用范围中选择一个随机数。

    以下是C中的基本实现(脚注:在mod上使用rand()不会产生良好的随机数,但它会为此示例做。)

    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;
    }