如何随机排列5个数字?

眼科医生 2016-05-21 11:26:51
有五个数1 2 3 4 ( 1 2 3 4),其中第五个数是1234中随机的一个数,然后五个数随机排列。如何实现。这是要解决一个视力表图形顺序,请大家给一个方法。
原来使用简单的随机数,但是雷同太多。现在想保证每个方向都有,但排列是随机的。
...全文
1549 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
回马枪 2016-05-25
  • 打赏
  • 举报
回复
从英俊少年的小马 到520下野的老马 老了 常常犯错误 比如 #9 的我理解为了全排列 而且这个语句也是错的:Select Distinct * From Query 应该是:Select Distinct * From Permutations 比如 #11 的注解也有问题 4 + 1 的排列的公式是:P(4) x C(4, 1) = 96 SQL 的排列组合语句是优美的 但不一定实用 用递归的方法其速度是最快的 老马老了
都市夜猫 2016-05-25
  • 打赏
  • 举报
回复
引用 11 楼 zyg8108 的回复:
*!* 4 + 1 的排列 (SQL-Select 算法) : ...
精妙的数据结构 - digit 或者叫 bit 2^0, 2^1, 2^2, 2^3 带来好的算法 - P1.Digit + P2.Digit + P3.Digit + P4.Digit = 15 -> 15 = 0x0f = 1111b 佩服之极,马先生的解决方案,充分说明了数据结构与算法之间的关系
回马枪 2016-05-24
  • 打赏
  • 举报
回复
是我理解错误,应该是:P(4) x C(4, 4) = 96

*!* 4 + 1 的排列 (SQL-Select 算法) :

Clear
Close Databases
*!*	前 4 位的全排列
Create Cursor P1 (Num C(1), Digit I)
Insert Into P1 Values ('1', 1)
Insert Into P1 Values ('2', 2)
Insert Into P1 Values ('3', 4)
Insert Into P1 Values ('4', 8)

*!*	后 1 位的 4 选 1 组合
Create Cursor PP2 (Num C(1))
Insert Into PP2 Values ('1')
Insert Into PP2 Values ('2')
Insert Into PP2 Values ('3')
Insert Into PP2 Values ('4')

*!*	P(4) x C(4, 4) = 96
Select P1.Num + P2.Num + P3.Num + P4.Num + P5.Num As 排列数 ;
    From P1 P1, P1 P2, P1 P3, P1 P4, PP2 P5 ;
    Where P1.Digit + P2.Digit + P3.Digit + P4.Digit = 15 ;
    Order By 排列数

? Reccount()

都市夜猫 2016-05-22
  • 打赏
  • 举报
回复
按楼主的要求,结论应该是 4 的全排列乘 4,也就是 4! * 4 = 4*3*2*1 *4 = 96 种排列
回马枪 2016-05-22
  • 打赏
  • 举报
回复
有五个数1 2 3 4 ( 1 2 3 4),其全排列是:P(5) = 120 其中第五个数是1234中随机的一个数,全排列时有重叠 比如: 假如当第五个数为 1 时,排在第一位与排在第二位是相同的,即前四位的 1234 排列 + 第五位的 1 组成 5 位排列:11234 11234 所以去掉每行有一次的重复行 最终的总排列数是: 120/2 = 60 计算代码为

*!*    5 个数的全排列 (SQL-Select 算法):

Clear
Close Databases
Create Cursor Permutations (排列数 C(5))
For I = 1 To 4
    =视力表(I)
    =Permutations()
Endfor

*!*	从查询结果中排除所有的重复行
Select Distinct * From Query
? Reccount()


Function 视力表(lnNun As Integer)
    *!*	5 个数的全排列 : P(5) = 240
    Create Cursor P1 (Num C(1), Digit I)
    Insert Into P1 Values ('1', 1)
    Insert Into P1 Values ('2', 2)
    Insert Into P1 Values ('3', 4)
    Insert Into P1 Values ('4', 8)
    Insert Into P1 Values (Transform(lnNun), 16)
Endfunc


Function Permutations
    *!*	5 的全排P :  120 种排P
    Select Distinct P1.Num + P2.Num + P3.Num + P4.Num + P5.Num As 排列数 From ;
        P1 P1, P1 P2, P1 P3, P1 P4 , P1 P5 ;
        Where P1.Digit + P2.Digit + P3.Digit + P4.Digit + P5.Digit = 31 ;
        Order By 1 Into Cursor Query
    Select Permutations
    Append From Dbf("Query")
Endfunc
然后可以随机取出该 60 个记录的任意一个
都市夜猫 2016-05-21
  • 打赏
  • 举报
回复
运行这个试试,是否符合你要求
#define K_最大行数		50

Create Cursor ttt (f1 I, f2 C(5))
Index on f2 tag f2

Rand(-1)

Do while Reccount() < K_最大行数
	c1 = '1234'
	c2 = ''
	For ii = Len(c1) to 2 step -1
		c0 = Substr(c1, getrandom(1, ii), 1)
		c1 = Chrtran(c1, c0, '')
		c2 = c2 + c0
	EndFor
	c3 = c2 + c1 + Transform(getrandom(1, 4))
	If !Seek(c3)
		Insert into ttt (f1, f2) values (1+Reccount(), c3)
	EndIf
EndDo

Delete Tag all
Locate
Browse

Function getrandom(n1, n2)
	Return n1 + Int(100*Rand()) % (1 + n2 - n1)
EndFunc
lygcw9602 2016-05-21
  • 打赏
  • 举报
回复
Clear
Rand(-1)
lnNum=5 &&生成随机数个数
Dimension nStr[lnNum]
N=0
Do While n<lnNum
   nItem = Ceiling(lnNum*Rand())
   If Ascan(nStr,nItem)=0
       nStr[N+1]=nItem
       N=N+1
   EndIf 
EndDo
Local a[5]
a[1]=1
a[2]=2
a[3]=3
a[4]=4
a[5]=4

For i=1 to 5
    ?a[nstr(i)] && 显示数组a中的元素值
EndFor 
眼科医生 2016-05-21
  • 打赏
  • 举报
回复
好了,可以了。
眼科医生 2016-05-21
  • 打赏
  • 举报
回复
引用 1 楼 lygcw9602 的回复:
Clear
Rand(-1)
lnNum=5 &&生成随机数个数
Dimension nStr[lnNum]
N=0
Do While n<lnNum
   nItem = Ceiling(lnNum*Rand())
   If Ascan(nStr,nItem)=0
       nStr[N+1]=nItem
       N=N+1
   EndIf 
EndDo
Local a[5]
a[1]=1
a[2]=2
a[3]=3
a[4]=4
a[5]=4

For i=1 to 5
    ?a[nstr(i)] && 显示数组a中的元素值
EndFor 
第5个数没有随机,总是重复4
眼科医生 2016-05-21
  • 打赏
  • 举报
回复
引用 3 楼 dkfdtf 的回复:
运行这个试试,是否符合你要求
#define K_最大行数		50

Create Cursor ttt (f1 I, f2 C(5))
Index on f2 tag f2

Rand(-1)

Do while Reccount() < K_最大行数
	c1 = '1234'
	c2 = ''
	For ii = Len(c1) to 2 step -1
		c0 = Substr(c1, getrandom(1, ii), 1)
		c1 = Chrtran(c1, c0, '')
		c2 = c2 + c0
	EndFor
	c3 = c2 + c1 + Transform(getrandom(1, 4))
	If !Seek(c3)
		Insert into ttt (f1, f2) values (1+Reccount(), c3)
	EndIf
EndDo

Delete Tag all
Locate
Browse

Function getrandom(n1, n2)
	Return n1 + Int(100*Rand()) % (1 + n2 - n1)
EndFunc
运行提示:方法程序或事件不能含有嵌套的过程或类定义
xuzuning 2016-05-21
  • 打赏
  • 举报
回复
一个可能的结果
xuzuning 2016-05-21
  • 打赏
  • 举报
回复
DIMENSION a[5]
FOR i=1 TO 4
  a[i] = i
NEXT
a[i] = CEILING(RAND() * 4)

shuffle(@a)
shuffle(@a)
shuffle(@a)
shuffle(@a)
shuffle(@a)

FUNCTION shuffle(a)
LOCAL n, m, i, c
m = ALEN(a)
FOR i = 1 TO m
  n = CEILING(RAND() * m)
  c = a[i]
  a[i] = a[n]
  a[n] = c
NEXT

* 以下只是用于检查
?
FOR i=1 TO m
  ?? a[i]
NEXT

2,722

社区成员

发帖
与我相关
我的任务
社区描述
VFP,是Microsoft公司推出的数据库开发软件,用它来开发数据库,既简单又方便。
社区管理员
  • VFP社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧