求教一道编程题

  1. 去年

    em.....随机输出1-100这100个数,要求不能重复。楼主想了好久qwq,苦于没有想到特别好的算法。有这样几种思路:1.每次用rand输出随机数,然后判断数组中是否有一样的数,如果重复,则再次随机并存储在刚才的位置。2.依次从一个篮子中随机抽取一个数,按顺序放在另一个数组中3.不用系统的rand函数,而是循环随机一个数i,在按顺序1-100的数组a【100】中借助整数变量j,交换a【i】和a【i+1】,循环足够多的次数,就能达到随机性。
    方法一不具有可实现性,复杂度太高,至少用到n*(n+1)/2次判断,方法二本打算用数组做,后来发现并没有办法保证不重复性,因为从数组中抽取是复制,不是是剪切,数组的长度是定死的,没办法删除元素。方法三也是为了保证随机性,就必须循环足够多次造成比较大的复杂度。
    求大神有木有比较好的算法分享下。萌新在这里谢过了~

  2. 天马行空

    2楼 2017年9月2日 数学版主

    随机产生一个1到100!的整数然后一一对应回去 /asnowwolf-amuse
    好吧换个说法..
    从空牌堆开始依次将所有牌插入到任意位置.
    再换个说法..
    从数列1,...,n开始,对i=1,...,n,从第i,...,n个数中任选一个和第i个交换.

  3. # -*- coding: UTF-8 -*-
    import random
    List1To100 = range(1,101)
    for x in range(0,100):
    	y = random.randint(0,99)
    	List1To100[x] , List1To100[y] = List1To100[y] , List1To100[x]
    
    print(List1To100)
  4. 天马行空

    4楼 2017年9月2日 数学版主
    去年天马行空 重新编辑

    @Sakura # -*- coding: UTF-8 -*- import random List1To100 = range(1,101) for x in range(0,100): y = random.randint(0,99) List1To100[x] , List1To100[y] = List1To100[y] , List1To100[x] print(List1To100)

    import random
    l=range(1,101)
    random.shuffle(l)

     /asnowwolf-amuse

  5. @天马行空 import random l=range(1,101) random.shuffle(l)
     /asnowwolf-amuse

    你这个把算法过程都隐藏起来了,这样不好

  6. 天马行空

    6楼 2017年9月2日 数学版主

    @Sakura 你这个把算法过程都隐藏起来了,这样不好

    不然我怎么用 /asnowwolf-amuse ? /asnowwolf-amuse

  7. 去年Sakura 重新编辑

    @天马行空 不然我怎么用 /asnowwolf-amuse ? /asnowwolf-amuse

    帮人帮到底,这个打乱数组的算法也写上呗 /0o0
    刚刚在群里问就是不知道怎么打乱数组比较高效

  8. 天马行空

    8楼 2017年9月2日 数学版主

    @Sakura 帮人帮到底,这个打乱数组的算法也写上呗 /0o0
    刚刚在群里问就是不知道怎么打乱数组比较高效

    反正乃的算法我在乃之前就已经说了吖 /<<

  9. 去年Sakura 重新编辑

    @天马行空 反正乃的算法我在乃之前就已经说了吖 /<<

    你手快 /:( ,我就比你晚了一分钟

  10. 感谢大佬们 /:)

  11. rc4算法里貌似有一大堆这样的东西 /<<

 

后才能发言