【问题标题】:Why does my random generator always return 0?为什么我的随机生成器总是返回 0?
【发布时间】:2013-04-23 15:04:09
【问题描述】:

我已经设置好了,所以如果返回 0,则将带有 1 的骰子图像设置为按钮图像的位置。它也使用不同的值和图像来做到这一点。 0 = 骰子 1, 1 = 骰子 2, 2 = 骰子 3, 3 = 骰子 4, 4 = 骰子 5。问题是返回的所有数字始终为 0,我知道这是因为按钮上都有一个图像。我看了无数的教程,不知道发生了什么!请网友们帮帮我!

这是我的代码:

package com.example.yahtzee;

import java.util.Random;

import android.os.Bundle;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.ImageButton;

public class MainActivity extends Activity {

static int mButtonAmount = 7;
static int SidesOfDice = 6;
final static int NumberOfDice = 6;
int Rolls = 1;
boolean mCACV = true;
String dialog_title;
String dialog_message;
String positive_button;
String neutral_button;
String negitive_button;
int DiceNumber;
int placeHolder;
int max = NumberOfDice + 1;

Button[]mButtons = new Button[mButtonAmount];
Boolean[]mButtonBools = new Boolean[mButtonAmount];
Drawable[]mDiceImages = new Drawable[SidesOfDice];
Boolean[]mIsDiceHeld = new Boolean[NumberOfDice];
ImageButton[]mImageButtons = new ImageButton[NumberOfDice];
int[]DieNumber = new int[NumberOfDice];

private static final Random RANDOM = new Random();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mButtons[0] = (Button) findViewById(R.id.start_roll);
    mButtons[0].setEnabled(true);
    mButtons[1] = (Button) findViewById(R.id.stop_roll);
    mButtons[1].setEnabled(false);
    mButtonBools[0] =  getResources().getBoolean(R.bool.is_start_roll_button_pressable);
    mButtonBools[1] = getResources().getBoolean(R.bool.is_stop_roll_button_pressable);

    mDiceImages[0] = getResources().getDrawable(R.drawable.diceside1);
    mDiceImages[1] = getResources().getDrawable(R.drawable.diceside2);
    mDiceImages[2] = getResources().getDrawable(R.drawable.diceside3);
    mDiceImages[3] = getResources().getDrawable(R.drawable.diceside4);
    mDiceImages[4] = getResources().getDrawable(R.drawable.diceside5);
    mDiceImages[5] = getResources().getDrawable(R.drawable.diceside6);

    mImageButtons[0] = (ImageButton) findViewById(R.id.die_1);
    mImageButtons[0].setClickable(false);
    mImageButtons[1] = (ImageButton) findViewById(R.id.die_2);
    mImageButtons[1].setClickable(false);
    mImageButtons[2] = (ImageButton) findViewById(R.id.die_3);
    mImageButtons[2].setClickable(false);
    mImageButtons[3] = (ImageButton) findViewById(R.id.die_4);
    mImageButtons[3].setClickable(false);
    mImageButtons[4] = (ImageButton) findViewById(R.id.die_5);
    mImageButtons[4].setClickable(false);

    mIsDiceHeld[0] = false;
    mIsDiceHeld[1] = false;
    mIsDiceHeld[2] = false;
    mIsDiceHeld[3] = false;
    mIsDiceHeld[4] = false;

    controlVariables();
}

public void controlVariables()
{
    rollDice();
            numberToImage();
}

public void checkAndChangeButtons()
{
    checkStartButton();
    checkStopButton();
}


public void rollDice()
{
    for(int i = 0; i < DieNumber.length; i++)
    {
    }

public void numberToImage()
{
    for(int i = 0; i < 5; i++)
    {
        mImageButtons[i].setBackground(mDiceImages[DieNumber[i]]);
    }
}

public int nextInt(int n)
{
    n = RANDOM.nextInt();
    return (n < 0 ? -n : n) % max;
}

【问题讨论】:

标签: android eclipse random numbers generator


【解决方案1】:

首先,您应该使用时间种子初始化 Random:

Random rand = new Random(System.currentTimeMillis());

然后,你可以得到你的 int 值在 0 和 max 之间

int i = rand.nextInt(max);

【讨论】:

  • 不应该调用 currentTimeMillis,Javadoc 说public Random(long seed) Creates a new random number generator using a single long seed. The seed is the initial value of the internal state of the pseudorandom number generator which is maintained by method next(int).
【解决方案2】:

您可以使用 SimonSays 答案,或者如果您想在特定范围内生成数字,您可以使用此

 Random generator = new Random();
 int i = generator.nextInt(10) + 1;

这将生成 1 到 11 之间的随机数

【讨论】:

    【解决方案3】:

    随机生成器示例:

    long RandomGenerator(long from,long to) throws InvalidParameterSpecException{
        if(to<from){throw new InvalidParameterSpecException("Parametr 'from' must bigger than 'to'");}
        return System.currentTimeMillis()%(to-from)+from;
    }
    

    RandomGenerator(-200,-100) 可以生成 -150、-175(从 -200 到 -100 的数字),但不能生成 150。第一个参数必须小于第二个。

    【讨论】:

      【解决方案4】:

      你的逻辑是正确的。您可以通过这种方式生成一个随机数。 我在这里实现的和你一模一样,看看(你可以在这里找到完整的例子:,点击主github full example上的随机例子:

      如果图像取决于随机数,那么您目前的错误可能是获取图像

      这是我的活动代码:

      public class RandomNumberActivity extends SherlockActivity{
      
         private static final Random RANDOM = new Random();
         private int count;
      
         private TextView numbers;
      
         @Override
         protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
      
              setContentView(R.layout.random_numbers);
              count = 0;
              numbers = (TextView) findViewById(R.id.numbers);
      
         }
      
      
         public void generate(View button)
         {        
              int i = RANDOM.nextInt();
              count++;
              i = (i < 0 ? -i : i) % 7;
      
              String current = numbers.getText().toString();
             numbers.setText(current.concat(count+"º: " + i+",\n"));      
         }
      }
      

      这里是我的布局:

      <?xml version="1.0" encoding="utf-8"?>
      <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:orientation="vertical" >
      
          <Button android:id="@+id/generate"
              android:layout_height="wrap_content"
              android:layout_width="wrap_content"
              android:text="@string/generate"
              android:layout_alignParentBottom="true"
              android:layout_centerHorizontal="true"
              android:onClick="generate"
          />
      
          <ScrollView 
              android:layout_height="match_parent"
              android:layout_width="match_parent"
              android:layout_above="@id/generate">
              <TextView 
                   android:id="@+id/numbers"
                   android:layout_height="wrap_content"
                   android:layout_width="match_parent"
                   android:textColor="@android:color/black"/>
      </ScrollView>
      
      
      </RelativeLayout>
      

      【讨论】:

        猜你喜欢
        • 2017-03-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-24
        • 1970-01-01
        • 2016-09-16
        • 2020-05-25
        • 2013-02-26
        相关资源
        最近更新 更多