public class MainActivity extends AppCompatActivity implements LotteryManager.OnCaptureDataListener, CompoundButton.OnCheckedChangeListener {
private LotteryManager mLotteryManager;
private TextView tv_show;
private RadioGroup rg_type;
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);
sw_open.setOnCheckedChangeListener(this);
sw_open.setChecked(true);
protected void onDestroy() {
public void onCaptureStart() {
Dbg.print("onCaptureStart");
tv_show.setText("正在生成号码...");
tv_show.setTextColor(Color.RED);
public void onCaptureStop(String source, long seed) {
Dbg.print("seed=" + seed, "source=" + source);
Random random = new Random(seed);
tv_show.setTextColor(Color.BLACK);
for (int i = 0; i < 5; i++) {
if (rg_type.getCheckedRadioButtonId() == R.id.rb_two_color) {
tv_show.append(makeTwoColorNumber(random));
tv_show.append(makeLargeLotteryNumber(random));
private String makeTwoColorNumber(Random random) {
LinkedList numbers = new LinkedList<>();
for (int i = 0; i < 33; i++) {
StringBuilder sb = new StringBuilder();
List selectedNumbers = new ArrayList<>();
for (int i = 0; i < 6; i++) {
int index = random.nextInt(numbers.size());
selectedNumbers.add(numbers.get(index));
Collections.sort(selectedNumbers);
for (Integer selectedNumber : selectedNumbers) {
sb.append(String.format("%02d", selectedNumber)).append(" ");
sb.append(String.format("%02d", random.nextInt(16) + 1));
private String makeLargeLotteryNumber(Random random) {
LinkedList frontNumbers = new LinkedList<>();
for (int i = 0; i < 35; i++) {
StringBuilder sb = new StringBuilder();
List 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 backNumbers = new LinkedList<>();
for (int i = 0; i < 12; i++) {
List 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(" ");
for (Integer selectedNumber : selectedBackNumbers) {
sb.append(String.format("%02d", selectedNumber)).append(" ");
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

<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">
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal">
android:id="@+id/sw_open"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/rg_type"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:orientation="horizontal">
android:id="@+id/rb_two_color"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/rb_large_lottery"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center">
android:id="@+id/tv_show"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#000000"
android:textSize="24sp" />

public class LotteryManager implements SensorEventListener {
private static final String TAG = "LotteryManager";
private Context mContext;
private SensorManager mSensorManager;
private OnCaptureDataListener onCaptureDataListener;
private boolean mEventStart;
private StringBuffer mDataSource = new StringBuffer();
public LotteryManager(Context mContext) {
this.mContext = mContext;
mSensorManager = (SensorManager) mContext.getSystemService(Service.SENSOR_SERVICE);
mSensorManager.registerListener(mDeviceEventListener, mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);
mSensorManager.unregisterListener(mDeviceEventListener);
private SensorEventListener mDeviceEventListener = new SensorEventListener() {
public void onSensorChanged(SensorEvent event) {
if (event.values != null && event.values.length == 3) {
long time = (event.timestamp - lastTime);
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;
lastTime = event.timestamp;
if (onCaptureDataListener != null) {
onCaptureDataListener.onCaptureStart();
String data = mDataSource.toString();
if (onCaptureDataListener != null) {
onCaptureDataListener.onCaptureStop(data, makeRandomSeed(data));
public void onAccuracyChanged(Sensor sensor, int accuracy) {
private long makeRandomSeed(String source) {
if (source == null || source.isEmpty()) {
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();
mDataSource.setLength(0);
List sensors = mSensorManager.getSensorList(Sensor.TYPE_ALL);
for (Sensor sensor : sensors) {
mSensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_FASTEST);
private void captureEnd() {
mSensorManager.unregisterListener(this);
public void onSensorChanged(SensorEvent event) {
mDataSource.append(event.timestamp).append("_");
if (event.values != null) {
for (float value : event.values) {
mDataSource.append(value).append("_");
public void onAccuracyChanged(Sensor sensor, int accuracy) {
public void setOnCaptureDataListener(OnCaptureDataListener onCaptureDataListener) {
this.onCaptureDataListener = onCaptureDataListener;
public interface OnCaptureDataListener {
void onCaptureStop(String source, long seed);
public void printSensors() {
List sensors = mSensorManager.getSensorList(Sensor.TYPE_ALL);
for (Sensor sensor : sensors) {
if (sensor.isWakeUpSensor()) {
Dbg.print(sensor.getType() + ", " + sensor.getName() + ", " + sensor.getStringType());

