android使用真随机算法模拟彩票号码生成器

public class MainActivity extends AppCompatActivity implements LotteryManager.OnCaptureDataListener, CompoundButton.OnCheckedChangeListener {

    private LotteryManager mLotteryManager;
    private TextView tv_show;
    private Switch sw_open;
    private RadioGroup rg_type;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tv_show = findViewById(R.id.tv_show);
        sw_open = findViewById(R.id.sw_open);
        rg_type = findViewById(R.id.rg_type);

        mLotteryManager = new LotteryManager(this.getApplicationContext());
        mLotteryManager.setOnCaptureDataListener(this);


        //mLotteryManager.printSensors();

        sw_open.setOnCheckedChangeListener(this);
        sw_open.setChecked(true);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mLotteryManager.stop();
    }


    @Override
    public void onCaptureStart() {
        Dbg.print("onCaptureStart");
        tv_show.setText("正在生成号码...");
        tv_show.setTextColor(Color.RED);
    }

    @Override
    public void onCaptureStop(String source, long seed) {
        Dbg.print("seed=" + seed, "source=" + source);
        Random random = new Random(seed); //得到真随机种子,再用java随机函数生成随机数
        //以下生成五注彩票号码
        tv_show.setTextColor(Color.BLACK);
        tv_show.setText(null);
        for (int i = 0; i < 5; i++) {
            if (rg_type.getCheckedRadioButtonId() == R.id.rb_two_color) {
                tv_show.append(makeTwoColorNumber(random));
            }else {
                tv_show.append(makeLargeLotteryNumber(random));
            }
            tv_show.append("\n");
        }
    }


    private String makeTwoColorNumber(Random random) {
        LinkedList<Integer> numbers = new LinkedList<>();
        for (int i = 0; i < 33; i++) {
            numbers.add(i + 1);
        }
        StringBuilder sb = new StringBuilder();
        List<Integer> selectedNumbers = new ArrayList<>();
        for (int i = 0; i < 6; i++) {
            int index = random.nextInt(numbers.size());
            selectedNumbers.add(numbers.get(index));
            numbers.remove(index);
        }
        Collections.sort(selectedNumbers);
        for (Integer selectedNumber : selectedNumbers) {
            sb.append(String.format("%02d", selectedNumber)).append("  ");
        }
        sb.append("+  ");
        sb.append(String.format("%02d", random.nextInt(16) + 1));
        return sb.toString();
    }

    private String makeLargeLotteryNumber(Random random) {
        //前区
        LinkedList<Integer> frontNumbers = new LinkedList<>();
        for (int i = 0; i < 35; i++) {
            frontNumbers.add(i + 1);
        }
        StringBuilder sb = new StringBuilder();
        List<Integer> selectedFrontNumbers = new ArrayList<>();
        for (int i = 0; i < 5; i++) {
            int index = random.nextInt(frontNumbers.size());
            selectedFrontNumbers.add(frontNumbers.get(index));
            frontNumbers.remove(index);
        }
        Collections.sort(selectedFrontNumbers);
        //后区
        LinkedList<Integer> backNumbers = new LinkedList<>();
        for (int i = 0; i < 12; i++) {
            backNumbers.add(i + 1);
        }
        List<Integer> selectedBackNumbers = new ArrayList<>();
        for (int i = 0; i < 2; i++) {
            int index = random.nextInt(backNumbers.size());
            selectedBackNumbers.add(backNumbers.get(index));
            backNumbers.remove(index);
        }
        Collections.sort(selectedBackNumbers);

        for (Integer selectedNumber : selectedFrontNumbers) {
            sb.append(String.format("%02d", selectedNumber)).append("  ");
        }
        sb.append("+  ");
        for (Integer selectedNumber : selectedBackNumbers) {
            sb.append(String.format("%02d", selectedNumber)).append("  ");
        }
        return sb.toString();
    }


    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        if (isChecked) {
            mLotteryManager.start();
        } else {
            mLotteryManager.stop();
        }
    }
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_vertical"
        android:orientation="horizontal">

        <Switch
            android:id="@+id/sw_open"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="开启机器 " />

        <RadioGroup
            android:id="@+id/rg_type"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"
            android:orientation="horizontal">

            <RadioButton
                android:id="@+id/rb_two_color"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="双色球" />

            <RadioButton
                android:id="@+id/rb_large_lottery"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="10dp"
                android:checked="true"
                android:text="大乐透" />

        </RadioGroup>

    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center">

        <TextView
            android:id="@+id/tv_show"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text=""
            android:textColor="#000000"
            android:textSize="24sp" />
    </LinearLayout>

</LinearLayout>
public class LotteryManager implements SensorEventListener {

    private static final String TAG = "LotteryManager";

    private Context mContext;
    private SensorManager mSensorManager;
    private OnCaptureDataListener onCaptureDataListener;
    private float x, y, z;
    private long lastTime;
    private boolean mEventStart;
    private StringBuffer mDataSource = new StringBuffer();

    public LotteryManager(Context mContext) {
        this.mContext = mContext;
        mSensorManager = (SensorManager) mContext.getSystemService(Service.SENSOR_SERVICE);
    }

    public void start() {
        mSensorManager.registerListener(mDeviceEventListener, mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);
    }

    public void stop() {
        mSensorManager.unregisterListener(mDeviceEventListener);
        captureEnd();
    }

    private SensorEventListener mDeviceEventListener = new SensorEventListener() {
        @Override
        public void onSensorChanged(SensorEvent event) {
            if (event.values != null && event.values.length == 3) {
                long time = (event.timestamp - lastTime);
                if (time > 100000000) {
                    float x1 = Math.abs(event.values[0] - x);
                    float y1 = Math.abs(event.values[1] - y);
                    float z1 = Math.abs(event.values[2] - z);
                    float speed = (x1 + y1 + z1) / (float) time * 1000000000L;
                    //Dbg.print(speed);
                    lastTime = event.timestamp;
                    x = event.values[0];
                    y = event.values[1];
                    z = event.values[2];
                    if (speed > 80) {
                        if (!mEventStart) {
                            if (onCaptureDataListener != null) {
                                onCaptureDataListener.onCaptureStart();
                            }
                            capture();
                            mEventStart = true;
                        }
                    } else if (speed < 2) {
                        if (mEventStart) {
                            captureEnd();
                            String data = mDataSource.toString();
                            if (onCaptureDataListener != null) {
                                onCaptureDataListener.onCaptureStop(data, makeRandomSeed(data));
                            }
                            mEventStart = false;
                        }
                    }
                }
            }
        }

        @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy) {

        }
    };

    private long makeRandomSeed(String source) {
        if (source == null || source.isEmpty()) {
            return 0;
        }
        try {
            MessageDigest digest = MessageDigest.getInstance("SHA256");
            digest.update(source.getBytes());
            byte[] hashBytes = digest.digest();
            BigInteger bi = new BigInteger(1, hashBytes);
            return bi.remainder(BigInteger.valueOf(Long.MAX_VALUE)).longValue();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return 0;
    }

    private void capture() {
        mDataSource.setLength(0);
        List<Sensor> sensors = mSensorManager.getSensorList(Sensor.TYPE_ALL);
        if (sensors != null) {
            for (Sensor sensor : sensors) {
                mSensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_FASTEST);
            }
        }
    }

    private void captureEnd() {
        mSensorManager.unregisterListener(this);
    }

    @Override
    public void onSensorChanged(SensorEvent event) {
        mDataSource.append(event.timestamp).append("_");
        if (event.values != null) {
            for (float value : event.values) {
                mDataSource.append(value).append("_");
            }

            /*StringBuilder sb = new StringBuilder();
            for (float value : event.values) {
                sb.append(value).append(",");
            }
            Dbg.print(event.sensor.getType(), sb);*/
        }
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {

    }

    public void setOnCaptureDataListener(OnCaptureDataListener onCaptureDataListener) {
        this.onCaptureDataListener = onCaptureDataListener;
    }

    public interface OnCaptureDataListener {
        void onCaptureStart();

        void onCaptureStop(String source, long seed);
    }

    public void printSensors() {
        List<Sensor> sensors = mSensorManager.getSensorList(Sensor.TYPE_ALL);
        if (sensors != null) {
            for (Sensor sensor : sensors) {
                if (sensor.isWakeUpSensor()) {
                    Dbg.print(sensor.getType() + ", " + sensor.getName() + ", " + sensor.getStringType());
                }
            }
        }
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值