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


    1. public class MainActivity extends AppCompatActivity implements LotteryManager.OnCaptureDataListener, CompoundButton.OnCheckedChangeListener {
    2. private LotteryManager mLotteryManager;
    3. private TextView tv_show;
    4. private Switch sw_open;
    5. private RadioGroup rg_type;
    6. @Override
    7. protected void onCreate(Bundle savedInstanceState) {
    8. super.onCreate(savedInstanceState);
    9. setContentView(R.layout.activity_main);
    10. tv_show = findViewById(R.id.tv_show);
    11. sw_open = findViewById(R.id.sw_open);
    12. rg_type = findViewById(R.id.rg_type);
    13. mLotteryManager = new LotteryManager(this.getApplicationContext());
    14. mLotteryManager.setOnCaptureDataListener(this);
    15. //mLotteryManager.printSensors();
    16. sw_open.setOnCheckedChangeListener(this);
    17. sw_open.setChecked(true);
    18. }
    19. @Override
    20. protected void onDestroy() {
    21. super.onDestroy();
    22. mLotteryManager.stop();
    23. }
    24. @Override
    25. public void onCaptureStart() {
    26. Dbg.print("onCaptureStart");
    27. tv_show.setText("正在生成号码...");
    28. tv_show.setTextColor(Color.RED);
    29. }
    30. @Override
    31. public void onCaptureStop(String source, long seed) {
    32. Dbg.print("seed=" + seed, "source=" + source);
    33. Random random = new Random(seed); //得到真随机种子,再用java随机函数生成随机数
    34. //以下生成五注彩票号码
    35. tv_show.setTextColor(Color.BLACK);
    36. tv_show.setText(null);
    37. for (int i = 0; i < 5; i++) {
    38. if (rg_type.getCheckedRadioButtonId() == R.id.rb_two_color) {
    39. tv_show.append(makeTwoColorNumber(random));
    40. }else {
    41. tv_show.append(makeLargeLotteryNumber(random));
    42. }
    43. tv_show.append("\n");
    44. }
    45. }
    46. private String makeTwoColorNumber(Random random) {
    47. LinkedList numbers = new LinkedList<>();
    48. for (int i = 0; i < 33; i++) {
    49. numbers.add(i + 1);
    50. }
    51. StringBuilder sb = new StringBuilder();
    52. List selectedNumbers = new ArrayList<>();
    53. for (int i = 0; i < 6; i++) {
    54. int index = random.nextInt(numbers.size());
    55. selectedNumbers.add(numbers.get(index));
    56. numbers.remove(index);
    57. }
    58. Collections.sort(selectedNumbers);
    59. for (Integer selectedNumber : selectedNumbers) {
    60. sb.append(String.format("%02d", selectedNumber)).append(" ");
    61. }
    62. sb.append("+ ");
    63. sb.append(String.format("%02d", random.nextInt(16) + 1));
    64. return sb.toString();
    65. }
    66. private String makeLargeLotteryNumber(Random random) {
    67. //前区
    68. LinkedList frontNumbers = new LinkedList<>();
    69. for (int i = 0; i < 35; i++) {
    70. frontNumbers.add(i + 1);
    71. }
    72. StringBuilder sb = new StringBuilder();
    73. List selectedFrontNumbers = new ArrayList<>();
    74. for (int i = 0; i < 5; i++) {
    75. int index = random.nextInt(frontNumbers.size());
    76. selectedFrontNumbers.add(frontNumbers.get(index));
    77. frontNumbers.remove(index);
    78. }
    79. Collections.sort(selectedFrontNumbers);
    80. //后区
    81. LinkedList backNumbers = new LinkedList<>();
    82. for (int i = 0; i < 12; i++) {
    83. backNumbers.add(i + 1);
    84. }
    85. List selectedBackNumbers = new ArrayList<>();
    86. for (int i = 0; i < 2; i++) {
    87. int index = random.nextInt(backNumbers.size());
    88. selectedBackNumbers.add(backNumbers.get(index));
    89. backNumbers.remove(index);
    90. }
    91. Collections.sort(selectedBackNumbers);
    92. for (Integer selectedNumber : selectedFrontNumbers) {
    93. sb.append(String.format("%02d", selectedNumber)).append(" ");
    94. }
    95. sb.append("+ ");
    96. for (Integer selectedNumber : selectedBackNumbers) {
    97. sb.append(String.format("%02d", selectedNumber)).append(" ");
    98. }
    99. return sb.toString();
    100. }
    101. @Override
    102. public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
    103. if (isChecked) {
    104. mLotteryManager.start();
    105. } else {
    106. mLotteryManager.stop();
    107. }
    108. }
    109. }
    1. "1.0" encoding="utf-8"?>
    2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    3. xmlns:app="http://schemas.android.com/apk/res-auto"
    4. xmlns:tools="http://schemas.android.com/tools"
    5. android:layout_width="match_parent"
    6. android:layout_height="match_parent"
    7. android:orientation="vertical"
    8. tools:context=".MainActivity">
    9. <LinearLayout
    10. android:layout_width="match_parent"
    11. android:layout_height="wrap_content"
    12. android:gravity="center_vertical"
    13. android:orientation="horizontal">
    14. <Switch
    15. android:id="@+id/sw_open"
    16. android:layout_width="wrap_content"
    17. android:layout_height="wrap_content"
    18. android:text="开启机器 " />
    19. <RadioGroup
    20. android:id="@+id/rg_type"
    21. android:layout_width="wrap_content"
    22. android:layout_height="wrap_content"
    23. android:layout_marginLeft="10dp"
    24. android:orientation="horizontal">
    25. <RadioButton
    26. android:id="@+id/rb_two_color"
    27. android:layout_width="wrap_content"
    28. android:layout_height="wrap_content"
    29. android:text="双色球" />
    30. <RadioButton
    31. android:id="@+id/rb_large_lottery"
    32. android:layout_width="wrap_content"
    33. android:layout_height="wrap_content"
    34. android:layout_marginLeft="10dp"
    35. android:checked="true"
    36. android:text="大乐透" />
    37. RadioGroup>
    38. LinearLayout>
    39. <LinearLayout
    40. android:layout_width="match_parent"
    41. android:layout_height="match_parent"
    42. android:gravity="center">
    43. <TextView
    44. android:id="@+id/tv_show"
    45. android:layout_width="wrap_content"
    46. android:layout_height="wrap_content"
    47. android:text=""
    48. android:textColor="#000000"
    49. android:textSize="24sp" />
    50. LinearLayout>
    51. LinearLayout>
    1. public class LotteryManager implements SensorEventListener {
    2. private static final String TAG = "LotteryManager";
    3. private Context mContext;
    4. private SensorManager mSensorManager;
    5. private OnCaptureDataListener onCaptureDataListener;
    6. private float x, y, z;
    7. private long lastTime;
    8. private boolean mEventStart;
    9. private StringBuffer mDataSource = new StringBuffer();
    10. public LotteryManager(Context mContext) {
    11. this.mContext = mContext;
    12. mSensorManager = (SensorManager) mContext.getSystemService(Service.SENSOR_SERVICE);
    13. }
    14. public void start() {
    15. mSensorManager.registerListener(mDeviceEventListener, mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);
    16. }
    17. public void stop() {
    18. mSensorManager.unregisterListener(mDeviceEventListener);
    19. captureEnd();
    20. }
    21. private SensorEventListener mDeviceEventListener = new SensorEventListener() {
    22. @Override
    23. public void onSensorChanged(SensorEvent event) {
    24. if (event.values != null && event.values.length == 3) {
    25. long time = (event.timestamp - lastTime);
    26. if (time > 100000000) {
    27. float x1 = Math.abs(event.values[0] - x);
    28. float y1 = Math.abs(event.values[1] - y);
    29. float z1 = Math.abs(event.values[2] - z);
    30. float speed = (x1 + y1 + z1) / (float) time * 1000000000L;
    31. //Dbg.print(speed);
    32. lastTime = event.timestamp;
    33. x = event.values[0];
    34. y = event.values[1];
    35. z = event.values[2];
    36. if (speed > 80) {
    37. if (!mEventStart) {
    38. if (onCaptureDataListener != null) {
    39. onCaptureDataListener.onCaptureStart();
    40. }
    41. capture();
    42. mEventStart = true;
    43. }
    44. } else if (speed < 2) {
    45. if (mEventStart) {
    46. captureEnd();
    47. String data = mDataSource.toString();
    48. if (onCaptureDataListener != null) {
    49. onCaptureDataListener.onCaptureStop(data, makeRandomSeed(data));
    50. }
    51. mEventStart = false;
    52. }
    53. }
    54. }
    55. }
    56. }
    57. @Override
    58. public void onAccuracyChanged(Sensor sensor, int accuracy) {
    59. }
    60. };
    61. private long makeRandomSeed(String source) {
    62. if (source == null || source.isEmpty()) {
    63. return 0;
    64. }
    65. try {
    66. MessageDigest digest = MessageDigest.getInstance("SHA256");
    67. digest.update(source.getBytes());
    68. byte[] hashBytes = digest.digest();
    69. BigInteger bi = new BigInteger(1, hashBytes);
    70. return bi.remainder(BigInteger.valueOf(Long.MAX_VALUE)).longValue();
    71. } catch (Exception e) {
    72. e.printStackTrace();
    73. }
    74. return 0;
    75. }
    76. private void capture() {
    77. mDataSource.setLength(0);
    78. List sensors = mSensorManager.getSensorList(Sensor.TYPE_ALL);
    79. if (sensors != null) {
    80. for (Sensor sensor : sensors) {
    81. mSensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_FASTEST);
    82. }
    83. }
    84. }
    85. private void captureEnd() {
    86. mSensorManager.unregisterListener(this);
    87. }
    88. @Override
    89. public void onSensorChanged(SensorEvent event) {
    90. mDataSource.append(event.timestamp).append("_");
    91. if (event.values != null) {
    92. for (float value : event.values) {
    93. mDataSource.append(value).append("_");
    94. }
    95. /*StringBuilder sb = new StringBuilder();
    96. for (float value : event.values) {
    97. sb.append(value).append(",");
    98. }
    99. Dbg.print(event.sensor.getType(), sb);*/
    100. }
    101. }
    102. @Override
    103. public void onAccuracyChanged(Sensor sensor, int accuracy) {
    104. }
    105. public void setOnCaptureDataListener(OnCaptureDataListener onCaptureDataListener) {
    106. this.onCaptureDataListener = onCaptureDataListener;
    107. }
    108. public interface OnCaptureDataListener {
    109. void onCaptureStart();
    110. void onCaptureStop(String source, long seed);
    111. }
    112. public void printSensors() {
    113. List sensors = mSensorManager.getSensorList(Sensor.TYPE_ALL);
    114. if (sensors != null) {
    115. for (Sensor sensor : sensors) {
    116. if (sensor.isWakeUpSensor()) {
    117. Dbg.print(sensor.getType() + ", " + sensor.getName() + ", " + sensor.getStringType());
    118. }
    119. }
    120. }
    121. }
    122. }

  • 相关阅读:
    2022学生用护眼灯什么品牌的好?精选学生护眼灯品牌排行榜
    腾讯云4核8G12M轻量服务器优惠价格446元一年,646元15个月
    链表-0405合并有序链表
    【无标题】
    机器学习模型,超级全面总结!
    hive sql 行列转换 开窗函数 炸裂函数
    Feign调用异常触发降级捕获异常
    深度学习训练基于Pod和RDMA
    D. Districts Connection
    [Linux]------初识多线程
  • 原文地址:https://blog.csdn.net/zzmzzff/article/details/136368950