我试图为这种情况找到一种有效的随机逻辑算法。哪种编程语言并不重要: 假设我有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]
重复元素没问题
我试图为此找到一些好的算法。
答案 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
中的元素填充其容量。
问题似乎是您需要从required
或optional
中取出随机数,同时确保required
为空在末尾。 [*]
创建一个新数组result
(需要至少与required
一样长 - 然后再次,可以从问题中推断出来)。将required
的所有元素复制到其中;用optional
中的随机元素填充其余部分。
此时,您已满足主要条件,但required
的元素始终首先出现。因此,作为最后一步,将现在存储在result
数组中的元素进行随机播放(例如,使用众所周知的Fisher-Yates shuffle)。
[*]'清空',因为required
中的所有数字必须至少使用一次。把他们带走" out"数组是确保这种情况发生的最简单方法。当(a)你可能有任何数字的重复时(从optional
和required
)和(b){ {1}} 不是required
的子集。
答案 1 :(得分:1)
如果您希望一次收到一个随机数并且不想预先创建完整的result
阵列,那么另一个答案是:
requested_number
之间的随机数(其中requested_number
是要获取的元素总数)。length(required)
之间,请从数组required
打印;然后从数组中删除; length(required)
然后从optional
数组中选择任意随机数。requested_number
并重复直至达到0. 您需要 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;
}