求大神帮助
有1-120个数字,一个文本框,一个按钮,点一次按钮文本框中随机生成一个数字,再点一次按钮文本框随机生成一个数字,以此类推。
每次点击出来的数字都不会再次出现,即点击120次后,所有的数字都会抽完,点击第121次时文本框将不会产生数字或程序自动结束。

解决方案 »

  1.   

    随机必然有重复,所谓“不重复的随机”实际上是洗牌。洗牌算法参考下面:
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    int d[6];
    int i,n,a,b,t;
    int c,j;
    void main() {
        srand(time(NULL));
        printf("shuffle 0..n-1 demo\n");
        for (n=1;n<=5;n++) {/* 测试1~5个元素 */
            printf("_____n=%d_____\n",n);
            j=1;
            for (c=1;c<=n;c++) j=j*c;/* j为n! */
            j*=n*2;
            for (c=1;c<=j;c++) {/* 测试n*2*n!次 */
                for (i=0;i<n;i++) d[i]=i;/* 填写0~n-1 */
                for (i=n;i>0;i--) {/* 打乱0~n-1 */
                    a=i-1;b=rand()%i;
                    if (a!=b) {t=d[a];d[a]=d[b];d[b]=t;}
                }
                printf("%04d:",c);
                for (i=0;i<n;i++) printf("%d",d[i]);
                printf("\n");
            }
        }
        printf("shuffle 1..n demo\n");
        for (n=1;n<=5;n++) {/* 测试1~5个元素 */
            printf("_____n=%d_____\n",n);
            j=1;
            for (c=1;c<=n;c++) j=j*c;/* j为n! */
            j*=n*2;
            for (c=1;c<=j;c++) {/* 测试n*2*n!次 */
                for (i=1;i<=n;i++) d[i]=i;/* 填写1~n */
                for (i=n;i>1;i--) {/* 打乱1~n */
                    a=i;b=rand()%i+1;
                    if (a!=b) {t=d[a];d[a]=d[b];d[b]=t;}
                }
                printf("%04d:",c);
                for (i=1;i<=n;i++) printf("%d",d[i]);
                printf("\n");
            }
        }
    }
      

  2.   

    应该可以更简单一点,不需要乱序,去掉3,4,5步,每次取数的时候,如果集合的count=0,就退出,如果count>0,直接随机生成0~count-1之间的index,取这个index对应的元素,输出以后并删除。