V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
kojp
V2EX  ›  问与答

我是来请教“算法”的。

  •  
  •   kojp · 2012-08-11 22:25:15 +08:00 · 3082 次点击
    这是一个创建于 4268 天前的主题,其中的信息可能已经有所发展或是发生改变。
    因为,这个跟语言无关,所以我就把他理解成算法了。如果有误,还请各位看官莫笑。


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

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

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

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

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



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

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

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

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

    我也很菜,只有很菜的人才会想到用数据储存吧。(其实用数据库太夸张了,呵呵文本文件或者SESSION足矣)。
    demon386
        11
    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
        12
    lwjefSub  
       2012-08-11 22:50:56 +08:00
    记数 =2 了就不取 全部 =2 重置
    lwjefSub
        13
    lwjefSub  
       2012-08-11 22:52:26 +08:00
    好像还是存储向的 我太不靠谱了
    kojp
        14
    kojp  
    OP
       2012-08-11 23:01:55 +08:00
    @demon386
    嗯基本理解,谢谢~~~
    kran
        15
    kran  
       2012-08-11 23:33:03 +08:00
    我倒认为搞随机数是没有必要的,访问网站的人流就是最随机的,只要你能按顺序发放,相对每个人就都是随机的了。
    tywtyw2002
        16
    tywtyw2002  
       2012-08-12 02:30:40 +08:00
    如果要求数量 只能写hash 指针指向下个 不过写hash还要锁文件。。。。
    hzlzh
        17
    hzlzh  
       2012-08-12 12:57:47 +08:00
    把5*2的随机数压栈,然后index逐个pop出来,就保证了每个2次。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5488 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 02:59 · PVG 10:59 · LAX 19:59 · JFK 22:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.