使用随机数发生器随机排列整数

时间:2012-06-03 16:46:57

标签: java algorithm random permutation

这是我的家庭作业:

Random r = new Random();
public int get100RandomNumber() {
    return 1+r.nextInt(100);
}
  

您将获得一个名为getrand100()(上图)的预定义函数   返回一个整数,它是1-100中的一个随机数。你可以打电话   这个功能可以多次,但要注意这个功能   是资源密集型的。你不能使用任何其他随机   发电机。您无法更改getrand100()的定义。

     

输出:以随机顺序打印数字1-20。 (不是20个随机数)

我尝试了什么..

public class MyClass {

    static Random r = new Random();
    static HashSet<Integer>;

    public static void main(String args[]) {
        myMethod();
        System.out.println(s);
    }    

    public static void myMethod() {
        boolean b = false;
        s = new HashSet<Integer>();
        int i = getRand100();
        if (i >= 20)
            i = i % 20;
        int j = 0;

        int k, l;
        while (s.size() <= 20) 
        {
            System.out.println("occurence no" + ++j);
            System.out.println("occurence value" + i);
            b = s.add(i);
            while (!b) {
                k = ++i;
                if(k<=20)
                    b = s.add(k);
                if(b==true)
                    break;
                if (!b) {
                    l = --i;
                    if(i>=1&&i<=20)
                        b = s.add(l);
                    if(b==true)
                        break;
                }
            }
        }
        System.out.println(s);
    }

    public static int getRand100()
    {
        return r.nextInt(100) + 1;
    }
}

感谢您的帮助!

3 个答案:

答案 0 :(得分:2)

我相信您在询问如何使用随机数生成器以随机顺序打印数字1到20。这也称为“随机排列”。 Fischer-Yates shuffle就是这样一种算法。

但是,要实现该算法,首先需要一个随机数生成器,它可以从N个项中选择一个具有相同概率的项,其中N的范围从2到设置的大小为shuffle,而你只有一个可以选择100个项目中的一个,概率相等。这可以通过模运算和“重新滚动”的组合轻松获得。

答案 1 :(得分:1)

假设您被允许使用ArrayList类,我建议您填写一个包含所需数字的列表(在本例中为1到20),然后从列表中随机选择数字并将其删除。对getRand100() % theList.size()使用{{1}}应该足够随机,您只需要调用它19次。当只剩下一个元素时,不再需要从列表中“随机”选择它。 ; - )

答案 2 :(得分:0)

我相信我已经想出了一种方法来转换1到n之间的任何数字! (假设项目数已知)为n项的唯一排列。

从本质上讲,这可以实现&#34;立即&#34;整个套牌的随机化,而不必使用任何改组算法。目前,它运行在O(n ^ 2)并且需要使用BigInteger软件包(即Java或Javascript),但我正在寻找优化运行时的方法(尽管如此,老实说,2500次迭代无论如何都不算​​什么)。无论如何,当给出至少226位有效的随机数据时,该函数能够在10毫秒内生成52个整数的混洗数组。

该方法类似于用于将十进制数转换为二进制数(连续除以2等)的方法。我很乐意根据要求提供我的代码;我觉得有趣的是我之前没有遇到它。

相关问题