理性是可以枚举的.例如,这个代码在开放区间0..1中找到第k个有理数,如果假设是互质的,{n1, d1}则排序在之前.{n2, d2}(d1<d2 || (d1==d2 && n1<n2)){n,d}
RankedRational[i_Integer?Positive] :=
Module[{sum = 0, eph = 1, den = 1},
While[sum < i, sum += (eph = EulerPhi[++den])];
Select[Range[den - 1], CoprimeQ[#, den] &][[i - (sum - eph)]]/den
]
In[118]:= Table[RankedRational[i], {i, 1, 11}]
Out[118]= {1/2, 1/3, 2/3, 1/4, 3/4, 1/5, 2/5, 3/5, 4/5, 1/6, 5/6}
Run Code Online (Sandbox Code Playgroud)
现在我想生成随机有理数,给出分母的上限 - 均匀分布,这样对于足够大的分母有理数将在单位区间内均匀分布.
直觉上,人们可以选择具有相同权重的小分母的所有有理数:
RandomRational1[maxden_, len_] :=
RandomChoice[(Table[
i/j, {j, 2, maxden}, {i,
Select[Range[j - 1], CoprimeQ[#, j] &]}] // Flatten), …Run Code Online (Sandbox Code Playgroud) 假设我编写了一个黑盒函数,它以数字方式评估昂贵的复数值函数,然后返回实部和虚部.
fun[x_?InexactNumberQ] := Module[{f = Sin[x]}, {Re[f], Im[f]}]
Run Code Online (Sandbox Code Playgroud)
然后我可以像往常一样在Plot中使用它,但是Plot不能识别该函数返回一对,并且颜色两者都是相同的颜色.如何告诉Mathematica指定的函数总是返回一个固定长度的向量?或者这个情节怎么样?

编辑:鉴于试图回答问题的尝试,我认为只有在样式作为获得的图形的后处理执行时,避免双重重新评估才有可能.最有可能的是以下不健壮,但它似乎适用于我的例子:
gr = Plot[fun[x + I], {x, -1, 1}, ImageSize -> 250];
k = 1;
{gr, gr /. {el_Line :> {ColorData[1][k++], el}}}
Run Code Online (Sandbox Code Playgroud)

在观察belisarius关于生成具有均匀分布元素的非奇异整数矩阵的问题时,我正在研究Dana Randal 撰写的一篇论文," 高效生成随机非奇异矩阵 ".提出的算法是递归的,并且涉及生成较低维度的矩阵并将其分配给给定的次要.我使用Insert和组合Transpose,但必须有更有效的方法.你会怎么做?
以下是代码:
Clear[Gen];
Gen[p_, 1] := {{{1}}, RandomInteger[{1, p - 1}, {1, 1}]};
Gen[p_, n_] := Module[{v, r, aa, tt, afr, am, tm},
While[True,
v = RandomInteger[{0, p - 1}, n];
r = LengthWhile[v, # == 0 &] + 1;
If[r <= n, Break[]]
];
afr = UnitVector[n, r];
{am, tm} = Gen[p, n - 1];
{Insert[
Transpose[
Insert[Transpose[am], RandomInteger[{0, p - 1}, n - 1], r]], …Run Code Online (Sandbox Code Playgroud)