【问题标题】:getting the random number generator to remove a choice once the selection has been made? JAVA做出选择后让随机数生成器删除选择? JAVA
【发布时间】:2017-06-18 23:54:27
【问题描述】:

我只想说,过去 3 个小时我一直在搜索这个(和其他几个)网站,但无济于事,我已经阅读了我能找到的关于我的主题的每一篇文章,或者它确实做到了不适用,或者我不太明白发生了什么。

我有 2 个问题。

  1. 我似乎无法让随机数生成器在做出选择后放弃它。

  2. 我的第二个问题是,每场比赛只能有一个六分回合,我似乎无法弄清楚如何将其限制为只有一个具有 6 分回合的特定限制的回合。

该程序旨在模拟选择跳跃 跳伞比赛。有三个独立的比赛 (A,AA,AAA) (难度级别,某些动作不会出现 A 或 AA,AAA全包),用户可以从中挑选以及 个人赛是6轮还是10轮(A会 始终为 6 轮)。一旦用户选择了比赛并且 轮数,程序应该输出个人 每轮要完成的动作以及得分 轮(对所有 6 轮或 10 轮比赛进行此操作)。这是 我的第一个问题在哪里:

一旦选择了一个动作,它就不能 在接下来的比赛中再次使用。我不能为 我的生活弄清楚如何做到这一点。

继续,有两个 单独的得分类别,编号的动作(我的 1-22 程序)和字母移动(23及以上),编号值得 2分,字母为1。每轮5分或6分

我遇到的问题是有一个 6 点回合,它只能由 3 个编号的移动组成,没有其他 组合是可以接受的;除此之外,只有 在整个比赛中获得六分。*

     for(int i=0; i < round; i++ )
     {
        System.out.printf("\nRound %d:\n", i+1);
        point = 0;

        while(point < 5)   
        { 
        pickedRandom=false;  
        formation = myRandom.nextInt(38) + 1;

            while(formation == 31) 
            {
                formation = myRandom.nextInt(38) + 1;
            }

            if(point == 4 && pickedRandom && formation < 23 )       
            {
                while(formation < 23)
                formation = myRandom.nextInt(38) + 1;
            }

            if(formation < 23)
            {
                point+=2;                   
            }
            else
            {
                pickedRandom=true;
                point++;

            }

            formationRound.set( formation, true );

            if(formation > 22)
            System.out.printf(" %s %s ",randomLetter(formation), formationName(formation));

            else
            System.out.printf(" %d %s", formation, formationName(formation)); 

         }
            System.out.println();
            System.out.printf( " %s \n", point );    
    }
}

【问题讨论】:

  • 一段文字讲述一个故事 - 毫无疑问 - 不知道你的代码出了什么问题,请参阅 Please add a minimal, complete, and verifiable exampleericlippert.com/2014/03/05/how-to-debug-small-programs
  • 欢迎来到 SO。对于某人来说,这是一个很长的描述。您是否通过调试器运行过代码?这是要做的第一件事。
  • 假设您使用相关代码段而不是整个 senario 以最少的描述发布您的问题。
  • 大家好,我发布完整代码和冗长描述的唯一原因是,如果不深入解释,我真的不知道如何描述我的问题,我会将代码缩减为给我带来问题的部分。我目前拥有的将运行,并且没有标记任何问题。无论我尝试了什么,我都无法让程序将每场比赛的输出限制为一轮 6 分,而且我无法找到一种方法让我的随机数生成器将其选择标记为下次不可用运行。
  • 希望编辑有所帮助。关于防止随机数生成器能够选择两次移动,我一直在尝试采取的方法是在选择移动后将该移动设置为真,但这只是我正在犯的一些简单错误,或者它只是我还不知道的东西,无论我做了什么,我都无法让程序合作。我什至不知道从哪里开始让程序每次比赛只输出一个 6 分的回合。 @ScaryWombat

标签: java arrays random


【解决方案1】:

由于格式、问题域或代码,我不理解您的问题。

但是我认为你说你想随机化一些数字,而不是替换。

这样做的一些策略是:

  1. 创建一个数字列表,然后随机播放,每次需要随机数字时弹出一个数字,直到你的“牌库”为空。

  2. 维护一组已绘制的数字。如果数字在集合中,则随机化另一个。

匹配 6 点回合约束的懒惰/蛮力方法是提前建立你的阵型 + 比赛,这是完整的。检查它是否符合您的约束,如果不符合,则重新生成整个竞争。

只有在约束无效的可能性相当低的情况下,这在性能方面才是真正经济的。

否则,您只能重新生成当前编队,但您需要检查是否仍有可能剩余的有效编队。我也不确定这会对你的随机编队分布造成多大的影响。

【讨论】:

  • 感谢您的回复,您有什么办法可以帮助我弄清楚如何去做。我在 Java 1 班,所以我在这方面的知识相当有限。我的程序成功地生成了随机数(移动),我只是不知道一旦它被选中后如何从集合中删除该数字。我曾尝试让程序在选中后将数字(移动)从 false 更改为 true,但到目前为止还没有成功。
  • 对于我问题的另一半,我的程序在 6 分回合的规定方面运行,但我不知道如何将其限制为每场比赛 6 分回合(轮数可以是 5 或 6 分)。希望这有助于澄清一点。
  • 6 点回合有保证吗?还是可能随机发生?
  • 这只是一种可能,抱歉没有具体说明
猜你喜欢
  • 1970-01-01
  • 2018-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-17
  • 2020-10-13
  • 2020-07-01
  • 2020-04-25
相关资源
最近更新 更多