gpt4 book ai didi

arrays - Maxima:定义一个函数,它返回一个范围内的随机整数,使得该值不同于另一个值或其他值的列表

转载 作者:行者123 更新时间:2023-12-04 08:33:26 36 4
gpt4 key购买 nike

注意标题中的问题在下面的“编辑:更大的问题”部分中得到解决

在 Maxima 中,是否有返回变量类型的函数?
我不确定 type是正确的词(我对此很陌生,但感觉它可能具有特定的技术意义),我正在寻找的是一个可以返回 true 的函数或 false如果一个变量 x是一个数字或一个数组,例如如果 x : 6;

IsArray(x) = false
IsNumber(x) = true
或者,例如如果 y : [1,2,3] ;
IsArray(y) = true;
IsNumber(y) = false;
我试过搜索 Maxima 文档,但没有找到任何东西。任何帮助,将不胜感激。

编辑:更大的问题。
我写了一个函数,它会返回一个随机值 y从一个范围,同时确保 y不同于另一个值 b :
DistinctValue(x,y,LowerLim,UpperLim):= block(
[newY:y],
if x = newY
then newY:DistinctValue(x,rand_range(LowerLim,UpperLim),LowerLim,UpperLim)
else newY:y, return(newY));
哪里 rand_range(LowerLim,UpperLim)是另一个选择随机整数的自定义函数 LowerLim ≤ x ≤ UpperLim .
很快我就意识到有时我需要几个这样不同的值,所以我调整了上面的代码,以便它可以将数组作为参数:
DistinctValue(x,y,LowerLim,UpperLim):= block([newY:y], 
for i:1 thru length(x)
do if x[i] = newY
then newY:DistinctValue(x,rand_range(LowerLim,UpperLim),LowerLim,UpperLim),
return(newY));
虽然我知道后者可以用于有一个数字要从范围中排除的情况,只需将它放在方括号中,我希望学习编写一个可以接受 x 的函数。作为数字或数组。我认为最简单的方法是使用 if/else 语句来评估变量的类型 x是,例如
DistinctValue(x,y,LowerLim,UpperLim):= block([newY:y], 
/* if it's a list, run the list version of the function */
if IsList(x)
then
for i:1 thru length(x)
do if x[i] = newY
then newY : DistinctValue(x, rand_range(LowerLim,UpperLim), LowerLim, UpperLim)
/* otherwise run the number version of the function */
else
if x = newY
then newY : DistinctValue(x, rand_range(LowerLim,UpperLim), LowerLim,UpperLim)
else newY:y,,
return(newY));
虽然这似乎是多余的,但我们正在另一个相当复杂的环境中实现 Maxima,它会被比我经验更少的人使用。此外,我预计会遇到其他更需要它的情况,而不是一个选项,在不久的将来。

最佳答案

关于函数 DistinctValue,这里是我将如何实现一个函数,该函数返回一个范围内的随机值,该范围不同于单个值或所有值列表。

DistinctValue(x, LowerLim, UpperLim) :=
if listp(x)
then block([y: rand_range(LowerLim, UpperLim)],
if member(y, x) /* need to try again */
then DistinctValue(x, LowerLim, UpperLim)
else y)
else DistinctValue([x], LowerLim, UpperLim);
这与上面显示的有些不同;这可能意味着我误解了要求。我会让你来判断。 rand_range可以表示为
rand_range(LowerLim, UpperLim) := LowerLim + random(UpperLim - LowerLim + 1);
UpperLim - LowerLim + 1保证 UpperLim可以返回,否则最大随机值来自 rand_rangeUpperLim负 1,假设 LowerLimUpperLim是整数。
编辑:似乎工作 - 在这里我已经 load(descriptive);获取 discrete_freq .
(%i32) makelist (DistinctValue ([13, 15, 17], 12, 18), 100);
(%o32) [18, 18, 14, 16, 18, 16, 12, 12, 18, 18, 12, 14, 12, 12,
18, 18, 14, 12, 12, 14, 16, 18, 12, 16, 12, 16, 14, 18, 16, 12,
14, 16, 14, 16, 16, 12, 14, 18, 14, 14, 14, 12, 16, 18, 14, 18,
18, 14, 14, 18, 12, 16, 18, 12, 16, 16, 12, 14, 16, 18, 16, 14,
16, 12, 16, 12, 14, 18, 16, 14, 12, 18, 14, 12, 16, 18, 12, 12,
14, 14, 18, 16, 18, 14, 14, 18, 16, 14, 12, 12, 14, 12, 18, 18,
12, 18, 12, 18, 18, 18]
(%i33) discrete_freq (%);
(%o33) [[12, 14, 16, 18], [26, 25, 21, 28]]

关于arrays - Maxima:定义一个函数,它返回一个范围内的随机整数,使得该值不同于另一个值或其他值的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64917568/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com