java 随机分配到队伍_关于java:随机“摇动”一个数组以分配新的随机点

我想做的是拿我的阵列硬币[]。 并且基本上将每个硬币重新排列到不同的位置。 这就是我到目前为止所拥有的。 当我这样做时,没有任何反应。 意味着所有的值都保持不变。 除了最后一个。 那个改变了。

public void shake()

{

for (int i = 0; i < coins.length; i++)

{

int index = Coin.RANDOM.nextInt(coins.length);

Coin temp = coins[index];

coins[index] = coins[i];

coins[i] = temp;

System.out.print(coins[i] +",");

}

}

我像这样实例化随机:

public static long SEED = System.currentTimeMillis();

public static Random RANDOM = new Random(SEED);

您可以发布输入示例及其提供的输出。 最好是几次尝试

你如何实例化Coin.RANDOM?

即使这样按照你想要的方式工作,它不会只是洗掉前11项吗? 应该是.nextInt(coins.length)?

@Marcus编辑你的帖子。 不要在评论中发帖。

谢谢乔我修好了,而Prateek我并不认为这很重要。 @YasmaniLlanes添加了coin.random实例化。

为什么要在swap而不是i打印值? 任何具体原因?

实际上没有..哈哈。 谢谢。 这给了我一个非常不同的输出。 但它现在做了什么。 正在复制它移动的硬币并复制它们。

请注意,java.util.Collections有一个shuffle()方法,可以执行您希望shake()方法执行的操作,但它适用于列表。 您可以在这样的数组上使用它:Collections.shuffle(Arrays.asList(coins));

请注意这一行

System.out.print(coins[swap] +",");

显示已移动(交换)的硬币。也许你正在考虑在i索引处显示新硬币:coins[i](无论如何这都不正确,因为已经显示的硬币仍然可以在下一次迭代中交换)。可能最好创建第二个for循环来显示最终的硬币值。

但这不仅仅是问题。要随机混洗数组,您应该使用Fisher-Yates算法,该算法与您的方法略有不同。您可以在SO上找到此算法的Java实现。

如果您使用List而不是Coin[](列表而不是数组),则可以使用Collections.shuffle方法并确保算法正确并且您将始终获得随机结果。

好吧,我改变了我的意思,现在唯一的问题是,我有硬币复制自己。

+1对于随机提示;-)

如果你有一个数组,你只需要输入几个字符:Collections.shuffle(Arrays.asList(coins))

好吧,我仍然不能使用我不相信。我很确定我必须创建自己的摇动方法。

即使您实施自己的摇动方法,我强烈建议您尝试Collection.shuffle并了解如何将其合并到您的使用中。

我很可能会,非常感谢! :)

你为什么不使用收藏品?将随机索引分配给数组或ArrayList中的每个值非常简单。

Collections.shuffle(coins);//if coins is array

Collections.shuffle(Arrays.asList(coins));//if coins is an ArrayList

当您使用swap作为索引时,您将使用该索引交换当前值,您可以编辑随机数生成器以生成特定范围之间的随机数(比如0 - coins.length),然后您可以将实现更改为这样的

public void shake()

{

Coin temp;

for (int i = 0; i < coins.length; i++)

{

//int swap = Coin.RANDOM.nextInt(coins.length);

temp = coins[swap];

coins[swap] = coins[i];

coins[i] = temp;

System.out.print(coins[i] +",");

}

}

对于代码中的注释行,请检查此以更新随机数生成器以生成两个值之间的数字。然后每次在i+1 - coins.length之间生成交换(索引)并继续此操作,直到完全耗尽阵列。这可确保您不会在索引处交换已显示的值。但我并不完全相信这确实是一个随机的随机播放,因为在循环开始时你有更多的交换索引选择,那么你将在循环后的某个时间,并且震动不是完全随机的。此解决方案仅在您想要严格实施自己的摇动方法而不使用Collections.shuffle作为@Tomek提到的情况下。

collections.shuffle的问题在于我之前从未使用过它。我也没见过它。当我尝试添加i + 1 - coins.length。我得到一个例外,说n必须是正数?

我的意思是i+1到coins.length不减去两者:)

哦,我的坏,这就是它出现在我的屏幕上的下一行。哈哈。但是现在它正在工作。非常感谢!!

很高兴我能帮助你!!如果您认为答案有助于您自由投票。

如果我有足够的声誉,我会哈哈,我还需要5个才能做到这一点。抱歉!!

您可以使用Knuth的重排算法重新排列数组,以便结果是均匀的随机排列。算法很简单,但就像一个魅力:

迭代数组并在迭代中我选择0和i之间的随机整数交换

交换数组[i]和数组[交换]

请注意,在您的实现中,随机生成在0到11之间,这似乎不会产生良好的混乱。

这是一个整数数组的混乱的代码示例:

import java.util.Random;

public class Test {

public static long SEED = System.currentTimeMillis();

public static Random RANDOM = new Random(SEED);

public static void shuffle(int[] numbers)

{

for (int i = 0; i < numbers.length; i++)

{

int swap = RANDOM.nextInt(i + 1);

int temp = numbers[swap];

numbers[swap] = numbers[i];

numbers[i] = temp;

}

for (int i = 0; i < numbers.length; i++) {

System.out.print(numbers[i] +",");

}

}

public static void main(String[] args) {

shuffle(new int[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11});

}

}

测试运行的输出是:

5, 11, 6, 1, 3, 10, 9, 2, 4, 7, 8,

我不知道为什么这会产生影响。但我只是将我的print语句移到了一个单独的循环中。并且它现在应该工作......我也把i + 1放在那里。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值