我是来请教“算法”的。

2012-08-11 22:25:15 +08:00
 kojp
因为,这个跟语言无关,所以我就把他理解成算法了。如果有误,还请各位看官莫笑。


一片萝卜地儿,总共5个坑。

$luobo=array('luo0','luo1','luo2','luo3','luo4');
echo $luobo[rand(0,5)];

这样纸的话。
luo0和luo4的出现机率不见得是完全一样的吧?

如果想要精确实现。$luobo的各个元素。接受10个IP访问。$luobo中各个元素,均出现两次。
这个要怎么控制?
3092 次点击
所在节点    问与答
17 条回复
kojp
2012-08-11 22:28:56 +08:00
好吧。。继续自言自语。
我有一个很笨拙 的思路,但是必须得借助一下文件的读取。

我把$luobo里面的五个要萝卜,放到一个文件里面txt或者xml
然后,不管哪个客户端来访问。我给出的都是第一个萝卜。给完以后,我就把这个萝卜给del掉。
等到五个萝卜都没了。我再重新生成这个文件。里面继续放上五个萝卜



kojp
2012-08-11 22:30:04 +08:00
有木有大神敢提示一下,数组的array_shift 或者unshift。或者pop之类的能搞定不?不借助读写服务器上面的文件。。。
luin
2012-08-11 22:36:52 +08:00
如果数据量足够大,rand的算法越好结果就越平均。
如果你要10个IP的情况下每个萝卜出现的次数一样(这个要和概率区分开...概率永远是一样滴),那么可以生成一个萝卜表,比如“3042103124...”,这样按顺序读入就可以实现你要的随机了。
很多游戏的随机数就是这么实现的。
demon386
2012-08-11 22:39:11 +08:00
@kojp 用一个10个元素的数组,其中你的这5个元素每个重复两次。

生成一个1-10的随机全排列。然后按全排列的顺序取,用完了再生成一个。

这样可以保证5个元素在10次里都被用到2次,同时顺序是随机的。
kran
2012-08-11 22:40:58 +08:00
非大神凑个热闹
这个跟语言也有关系。。
起码php没有应用层级的变量(启动后常驻的),。net有这东西
可以用内存数据库吧 memcached,redis?
计数器%5
kojp
2012-08-11 22:41:43 +08:00
@luin
谢谢你消灭零回复~~~

关于rand的算法,算是理解了。
关于第二个萝卜表的问题,不是同一个会话的话。大家访问的虽然是同一个表。但顺序没办法控制的呀
。不借助文件的读写能实现么?
demon386
2012-08-11 22:43:04 +08:00
@kojp 我说的只是个概念,实现的时候完全可以生成0-9的全排列,然后/2,结果为0-4的整数,对应相应元素。
benzhe
2012-08-11 22:44:19 +08:00
感觉不借助数据储存是不行滴,因为有公共数据,除了文件读写还可以用数据库,memcache,甚至强制同session存储数据。俺很菜,上面仅供参考
kojp
2012-08-11 22:45:19 +08:00
@kran
还是你懂我。。。我需要的就是一个启动后常驻的变量的东东。
.net一听就头大~~~
@demon386
"生成一个1-10的随机全排列。然后按全排列的顺序取,用完了再生成一个。"
这一句,很难理解。这对应用到多IP么?多个会话。
kojp
2012-08-11 22:47:13 +08:00
@benzhe

我也很菜,只有很菜的人才会想到用数据储存吧。(其实用数据库太夸张了,呵呵文本文件或者SESSION足矣)。
demon386
2012-08-11 22:49:20 +08:00
@kojp 比如生成某个随机排列
2 3 1 4 5 9 6 8 10 7

这是个数组,作为index,按这个index的顺序去取元素内容就行了,用完就把当前index pop出来。等这个index数组用完了,就重新生成一个。

至于生成随机排列的方法,网上搜random permutation就有了。
lwjefSub
2012-08-11 22:50:56 +08:00
记数 =2 了就不取 全部 =2 重置
lwjefSub
2012-08-11 22:52:26 +08:00
好像还是存储向的 我太不靠谱了
kojp
2012-08-11 23:01:55 +08:00
@demon386
嗯基本理解,谢谢~~~
kran
2012-08-11 23:33:03 +08:00
我倒认为搞随机数是没有必要的,访问网站的人流就是最随机的,只要你能按顺序发放,相对每个人就都是随机的了。
tywtyw2002
2012-08-12 02:30:40 +08:00
如果要求数量 只能写hash 指针指向下个 不过写hash还要锁文件。。。。
hzlzh
2012-08-12 12:57:47 +08:00
把5*2的随机数压栈,然后index逐个pop出来,就保证了每个2次。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/44907

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX