问题描述
问题
给定一个列表 L:[a,b,c,d,e,f]
是否有一种内置的方式随机排列列表的元素?类似于:
M:random_order(L);
> [ b,a,f]
我查看了 Functions and Variables for Lists 的文档,了解用于调整列表中元素顺序的任何内置选项,但没有看到任何明显的内容。
上下文
我正在尝试生成最大和为 x
的 s
项列表。现在,我通过创建一个列表来执行此操作,其中每个项都是 1 和最大值之间的随机数,以确保如果剩余项的最小值为 1,则总和最多为 { {1}}:
s
但是,这会生成列表,其中较早的术语(即 较低的索引)具有较高值的可能性较高;而我想要更均匀的值分布。
我能想到的最简单的解决方案就是将 /* `x` is the total number of terms; `s` is the max sum */
gen_val(x,s):=block([x:x,s:s,vals:makelist(nul,i,x) ],/*
the first value is a random integer in [1,(s-x)],if
vals[1] = (s-x),then all remaining terms have to be equal to 1
*/
vals[1]: 1 + random(s-x),/*
subsequent terms are assigned in the same way,subtracting the sum of
prevIoUsly assigned values,as well as reserving at least 1 unit for
each remaining term
*/
for i:2 thru x
do vals[i]:1 + random(s-sum(vals[k],k,1,i-1)-(x-i+1)),/* return the list */
vals
);
列表的元素打乱;但是,我对任何其他实现此预期结果的方法同样感兴趣(即vals
项的列表,其总和最多为 x
)。
更广泛的上下文是将数轴的区间划分为子区间的问题。我决定将间隔的长度和分区的数量作为构建子间隔的变量,因此达到了上述目标。如果 s
是完整区间,那么对于任何 I = [a,b]
,c
使得 d
我们可以定义子区间 c+d =< b-a
,[a,a+c]
,{ {1}}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)