1
zhuzhuor 2012-03-18 11:05:33 +08:00
#!/usr/bin/env python
from random import randint n = range(1, 11) for i in range(10): idx = randint(i, 9) n[i], n[idx] = n[idx], n[i] #交换位置 print n 估计这样算比较好吧 不过python有shuffle函数 |
2
zhuzhuor 2012-03-18 11:06:29 +08:00
T_T空格都被吃了...for后面两行有tab缩进,意会就行了...
|
3
lldong 2012-03-18 11:24:37 +08:00
《编程珠玑》里貌似第一章有道习题就是用楼上这种算法,
|
4
Mutoo 2012-03-18 12:01:36 +08:00
actionscript,一句话的事儿。
function randomArr(arr:Array):Array { return arr.sort (function(){return Math.random ()>.5}); } |
5
phuslu 2012-03-18 12:04:51 +08:00
@Mutoo python也比较简单
python -c "import random;print random.sample(xrange(10),10)" |
6
zhuzhuor 2012-03-18 12:11:16 +08:00
@lidong 是说习题答案么,编程珠玑我一直想看却一直没看,不知道还有更好的算法没,感觉没输出一个数都要random一次,好的随机数生成器其实速度很慢呢
|
7
annielong 2012-03-18 12:38:37 +08:00
关键在于random函数,以前曾经有一篇文章专门研究这个的,看似简单实际很复杂。
|
8
guoquan 2012-03-18 13:03:12 +08:00
每个语言基本东哥个随机函数生成器和一个shuffle
|
9
lisztli 2012-03-18 13:09:07 +08:00
数字不能重复的话,还能叫随机码?
|
10
lisztli 2012-03-18 13:10:19 +08:00
理解错了
python random.shuffle |
11
lichgo OP 嗯如果不用python、AS的函数呢?
毕竟是讨论算法而不是找API之类的函数。 或者说有没有人知道shuffle函数的底层算法是什么样的? |
12
reus 2012-03-18 13:45:47 +08:00
|
13
Mutoo 2012-03-18 13:56:23 +08:00
简单说就是使用一个比较器(comparator),通常是一个函数,这个函数传入两个参数,例如a和b,返回一个整数,-1表示a应该放在b前面,0表示a和b等价,1表示a应该放在b后面
然后遍历一个数组,每次取两个数放到比较器中,根据返回的整数重新排放两个数 如果比较器规定大数在前,小数在后,那么整个过程下来就能一个由大到小的数组。 如果比较器规定小数在前,大数在后,那么可以得到由小到大的数组。 如果比较器规定每次比较都随机摆放,那么就能得到乱序数组。 对给定1~10,这十个数字组成的有序数组,放到一个随机比较器中,就能得到不重复的乱序数组。 |
14
zhuzhuor 2012-03-18 14:06:01 +08:00
|
18
lichgo OP @zhuzhuor 当然有看的,你是第一个回复的人肯定看了。我的想法跟你的差不多,就没怎么评论。想看看其他人怎么想。Anyway,感谢关注。
|
19
pursuit 2012-03-19 18:47:18 +08:00
感觉也就是 洗牌算法 了吧
|
20
antique 2015-03-01 21:24:44 +08:00
谷歌到这里几年前的帖子,1楼说的简单换序存在概率问题,参见分析
http://coolshell.cn/articles/8593.html 手头碰到的问题用这两种方法测试,结果确实不同,影响不小。 正确的随机是 Fisher_Yates洗牌算法(测试正确) void ShuffleArray_Fisher_Yates(char* arr, int len) { int i = len, j; char temp; if ( i == 0 ) return; while ( --i ) { j = rand() % (i+1); temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } |