当前位置: 首页 > news >正文

android实现真随机数生成器(物理随机)

原理:通过设备内置传感器生成随机散列字串,再通过取余等操作获取最终数字,这种方法不同于传统的伪随机数生成器,而是依赖于硬件,需要硬件支持。

private SensorManager sm;private int eventCount;private int flagCount;private StringBuffer mKeyBuffer = new StringBuffer();private boolean isRunning;private List<Integer> numbers = new ArrayList<>();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_sensor);sm = (SensorManager) getApplicationContext().getSystemService(Service.SENSOR_SERVICE);List<Sensor> sensors = sm.getSensorList(Sensor.TYPE_ALL);for (Sensor sensor : sensors) {sm.registerListener(this, sensor, SensorManager.SENSOR_DELAY_FASTEST);}isRunning = true;//final StringBuffer values = new StringBuffer();new Thread() {@Overridepublic void run() {super.run();Dbg.print("====start====");while (isRunning) {try {Thread.sleep(500); //每隔500ms生成一个数} catch (InterruptedException e) {e.printStackTrace();}/*if (eventCount >= 100000) {break;}*/if (mKeyBuffer.length() == 0) {continue;}String source = mKeyBuffer.toString();mKeyBuffer.setLength(0);byte[] hash = getHash(source);if (hash == null) continue;BigInteger bi = new BigInteger(1, hash);  //制作正整数int number = bi.testBit(0) ? 1 : 0; //生成0或者1,也可生成其它值//int randomInt = bi.remainder(BigInteger.valueOf(2147483648L)).intValue(); //生成随机int值if (number == 1) {flagCount++;}eventCount++;//numbers.add(number);Dbg.print(number, eventCount, flagCount, (float) flagCount / eventCount);}Dbg.print("====end====");}}.start();}@Overrideprotected void onDestroy() {super.onDestroy();sm.unregisterListener(this);isRunning = false;}private String makeEventKey(SensorEvent event) {StringBuilder sb = new StringBuilder();sb.append(event.timestamp);if (event.values != null) {for (float value : event.values) {sb.append("_").append(value);}}return sb.toString();}@Overridepublic void onSensorChanged(SensorEvent event) {String key = makeEventKey(event);mKeyBuffer.append(key).append("_");}@Overridepublic void onAccuracyChanged(Sensor sensor, int accuracy) {}public static byte[] getHash(String source) {MessageDigest digest = null;try {digest = MessageDigest.getInstance("SHA256");digest.update(source.getBytes());return digest.digest();} catch (Exception e) {e.printStackTrace();}return null;}

相关文章:

  • 设计模式学习笔记 - 面向对象 - 5.接口和抽象类的区别
  • 倒计时41天
  • chatgpt:还有哪些人工智能和科技值得关注?
  • AI浅谈:计算机视觉(CV)技术的优势和挑战
  • 策略模式:封装行为策略,灵活切换实现多态业务逻辑
  • uniapp的扩展组件uni-popup 弹出层自动打开
  • python学习笔记-内置异常
  • CMS垃圾回收器
  • Kotlin:协程基础
  • Leetcoder Day25| 回溯part05:子集+排列
  • 大概了解一下G1收集器
  • Redis 学习笔记 3:黑马点评
  • 服务器部署java 的docker项目,以及常用的一些命令
  • 可视化图文报表
  • Python爬虫进阶:爬取在线电视剧信息与高级检索
  • [译]CSS 居中(Center)方法大合集
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • Android框架之Volley
  • docker容器内的网络抓包
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • Gradle 5.0 正式版发布
  • IDEA常用插件整理
  • Kibana配置logstash,报表一体化
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • Windows Containers 大冒险: 容器网络
  • XForms - 更强大的Form
  • 阿里云购买磁盘后挂载
  • 从PHP迁移至Golang - 基础篇
  • mysql面试题分组并合并列
  • 如何在招聘中考核.NET架构师
  • ​TypeScript都不会用,也敢说会前端?
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • #QT(一种朴素的计算器实现方法)
  • (02)Hive SQL编译成MapReduce任务的过程
  • (11)MSP430F5529 定时器B
  • (16)Reactor的测试——响应式Spring的道法术器
  • (二)c52学习之旅-简单了解单片机
  • (二)hibernate配置管理
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (四)鸿鹄云架构一服务注册中心
  • (四)模仿学习-完成后台管理页面查询
  • (算法设计与分析)第一章算法概述-习题
  • (转)ORM
  • (转)socket Aio demo
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)
  • .Net程序猿乐Android发展---(10)框架布局FrameLayout
  • /etc/shadow字段详解
  • @Conditional注解详解
  • [asp.net core]project.json(2)
  • [AX]AX2012 AIF(四):文档服务应用实例
  • [BZOJ4337][BJOI2015]树的同构(树的最小表示法)
  • [C/C++]数据结构 栈和队列()
  • [CVPR 2023:3D Gaussian Splatting:实时的神经场渲染]