xwyam
2017-10-26 09:23:56 +08:00
这个可以给每个算式指定特征数字啊,映射还是很简单的。个人觉得还是不要动用数据库了。
对于所有 n 以内的数 a,b,所有(a,b)数对能一一对应到 a*n+b 这个特征数,总共有 n^2 种。这样每种标点符号就有 n^2 个特征数了。再把每种标点符号的特征数定义为 k*(n^2),这样从给定的特征数 code 就很容易转换出一个算式了——
(sign) = code % (n^2)
a = [code % (n^2)] // n
b = [code % (n^2)] % n
这样的特征数,能覆盖 0~k*(n^2)中的所有数字了,其中 k 是标点符号的个数。
特征数搞定,下边说随机产生的问题。生成一个序列 0~k*(n^2),再指定一个变量 L 表示该序列中所剩数字的多少。循环执行下边的过程——
1. 从 L 个数的序列中随机选出第 i 个数字,这个数字就是本轮要使用的特征数 code
2. 将 code 用上边的映射关系转换出一个算式出来输出
3. 如果 i 不是第 L 个数的话,就把第 L 个数放在 i 的位置上,然后把 L 减小 1 (这样做的好处是保证序列前 L 个数都是未输出的数字,下轮循环第 1 步容易取随机数)
4. 如果取够了,就退出;如果序列取空了还没有取够,就再重新生成一个新的 0~k*(n^2)的序列,再次循环
V2EX 贴代码似乎会乱掉,我就不贴了。如果 LZ 有其他问题,可以私信我。