-3

这是我的家庭作业:

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;
    }
}

谢谢你的帮助!

4

3 回答 3

3

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

但是,要实现该算法,您首先需要一个随机数生成器,它可以从 N 个项目中以相等的概率挑选一个,其中 N 的范围从 2 到要洗牌的集合的大小,而您只有一个可以挑选100 个项目中的一个等概率。这可以通过模算术和“重滚”的组合轻松获得。

于 2012-06-03T16:59:50.473 回答
1

假设您被允许使用该ArrayList课程,我建议您在列表中填写您想要的数字(在这种情况下为 1 到 20),然后从列表中随机选择数字并将其删除。使用getRand100() % theList.size()对于您的原因应该是足够随机的,您只需要调用它 19 次。当只剩下一个元素时,不再需要从列表中“随机”选择它。;-)

于 2012-06-03T19:38:43.093 回答
0

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

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

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

于 2015-04-02T07:29:32.730 回答