php 生成随机数

记录:随机数抽奖

要求:每次生成3个 1 - 10 之间可重复(或不可重复)的随机数,10次为一轮,每轮要求数字5出现6次、数字4出现3次、…。

提炼需求:
1,可设置最小数、最大数、每次抽奖生成随机数的个数、是否允许重复
2,可设置每轮指定数字的出现次数
3,可设置每轮的抽奖次数

注意:设置项发生变化,则重置游戏

效果图示例:
在这里插入图片描述
在这里插入图片描述

Choujianglog 模型

<?phpnamespace app\admin\model\choujiang;use think\Model;class Choujianglog extends Model
{// 表名protected $name = 'choujiang_log';// 自动写入时间戳字段protected $autoWriteTimestamp = 'integer';// 定义时间戳字段名protected $createTime = 'createtime';protected $updateTime = false;protected $deleteTime = false;// 追加属性protected $append = [];// 获取抽奖当前轮次public function getLunci($choujiang_id, $yilunchoujiagcishu) {$lunci = $this->where(['choujiang_id'=>$choujiang_id])->max('lunci');if(!$lunci){$lunci = 1;}return $lunci;}// 获取抽奖接下来的轮次public function getnextLunci($choujiang_id, $yilunchoujiagcishu) {$lunci = $this->where(['choujiang_id'=>$choujiang_id])->max('lunci');if(!$lunci){$lunci = 1;}$choujiangcishu = $this->where(['choujiang_id'=>$choujiang_id, 'lunci'=>$lunci])->group('sign')->count();if($choujiangcishu >= $yilunchoujiagcishu){$lunci += 1;}return $lunci;}// 生成signpublic function createSign() {$str = '123567890123567890123567890';//34个字符$str = str_shuffle($str);   //随机地打乱字符串中的所有字符$sign = date('YmdHis').substr($str,0,4); //截取字符串if($this->where(['sign'=>$sign])->value('sign')){$this->createSign();}else{return $sign;}}}

Choujiang模型

<?phpnamespace app\admin\model\choujiang;use think\Model;class Choujiang extends Model
{// 表名protected $name = 'choujiang';// 自动写入时间戳字段protected $autoWriteTimestamp = 'integer';// 定义时间戳字段名protected $createTime = 'createtime';protected $updateTime = 'updatetime';protected $deleteTime = false;// 追加属性protected $append = ['state_text'];public function getStateList(){return ['1' => __('State 1'), '2' => __('State 2')];}public function getStateTextAttr($value, $data){$value = $value ? $value : (isset($data['state']) ? $data['state'] : '');$list = $this->getStateList();return isset($list[$value]) ? $list[$value] : '';}}

Choujiangset模型

<?phpnamespace app\admin\model\choujiang;use think\Model;class Choujiangset extends Model
{// 表名protected $name = 'choujiang_set';// 自动写入时间戳字段protected $autoWriteTimestamp = false;// 定义时间戳字段名protected $createTime = false;protected $updateTime = false;protected $deleteTime = false;// 追加属性protected $append = ['state_text'];public function getStateList(){return ['1' => __('State 1'), '2' => __('State 2')];}public function getStateTextAttr($value, $data){$value = $value ? $value : (isset($data['state']) ? $data['state'] : '');$list = $this->getStateList();return isset($list[$value]) ? $list[$value] : '';}}

代码:

<?phpnamespace app\api\controller;use app\common\controller\Api;
use think\Exception;
use think\Validate;
use app\admin\model\choujiang\Choujiang as ChoujiangModel;
use app\admin\model\choujiang\Choujianglog as ChoujianglogModel;
use app\admin\model\choujiang\Choujiangset as ChoujiangsetModel;/*** 随机数接口*/
class Choujiang extends Api
{protected $noNeedLogin = ['*'];protected $noNeedRight = ['*'];protected $yilunchoujiagcishu = 10; //一轮抽奖次数protected $default_min_val = 1; //(默认)最小数protected $default_max_val = 10; //(默认)最大数protected $default_geshu = 3; //(默认)个数protected $default_state = 1; //(默认)允许重复:1=是,2=否public function _initialize(){parent::_initialize();if(!((new ChoujiangsetModel())->where(['id'=>['>', 0]])->value('id'))){(new ChoujiangsetModel())->save(['min_val'=>$this->default_min_val,'max_val'=>$this->default_max_val,'geshu'=>$this->default_geshu,'state'=>$this->default_state,]);}if(!((new ChoujiangModel())->where(['id'=>['>', 0]])->value('id'))){$info = (new ChoujiangsetModel())->where(['id'=>['>', 0]])->field('min_val,max_val,geshu,state')->find();(new ChoujiangModel())->save(['min_val'=>$info['min_val'],'max_val'=>$info['max_val'],'geshu'=>$info['geshu'],'state'=>$info['state'],]);}}/*** 生成随机数页面,获取设置** @ApiMethod (GET)* @ApiHeaders  (name=token, type=string, required=false, description="请求的Token")*/public function getSet(){try {  $info = (new ChoujiangsetModel())->where(['id'=>['>', 0]])->field('min_val,max_val,geshu,state')->find();$this->success("OK", ['info' => $info,]);} catch (Exception $e) {$this->error($e->getMessage());}}/*** 生成随机数页面,修改设置** @ApiMethod (POST)* @ApiHeaders  (name=token, type=string, required=false, description="请求的Token")//  * @param string $min_val  最小数//  * @param string $max_val  最大数* @param string $geshu  个数//  * @param string $state  允许重复:1=是,2=否*/public function editSet(){try {  $min_val = $this->request->post('min_val/d',1);$max_val = $this->request->post('max_val/d',10);$geshu = $this->request->post('geshu/d',3);$state = $this->request->post('state',1);if(!in_array($geshu, [1,2,3])){$this->error('个数只能设置为1,2,3');}if($min_val >= $max_val){$this->error('最小数应小于最大数');}if($min_val <= 0 || $max_val <= 0){$this->error('最小数和最大数应>0');}if(!in_array($state, [1,2])){$this->error('允许重复只能设置为1,2');}$info = (new ChoujiangsetModel())->where(['id'=>['>', 0]])->field('min_val,max_val,geshu,state')->find();$data = ['min_val' => $min_val,'max_val' => $max_val,'geshu' => $geshu,'state' => $state,];$info->save($data);$choujianginfo = (new ChoujiangModel())->where(['id'=>['>', 0]])->field('min_val,max_val,geshu,state')->order('id desc')->find();// 若配置修改则重置游戏if($choujianginfo['min_val'] != $data['min_val'] || $choujianginfo['max_val'] != $data['max_val'] || $choujianginfo['geshu'] != $data['geshu'] || $choujianginfo['state'] != $data['state']){(new ChoujiangModel())->save(['min_val'=>$data['min_val'],'max_val'=>$data['max_val'],'geshu'=>$data['geshu'],'state'=>$data['state'],]);}$this->success("保存成功", ['info' => $data,]);} catch (Exception $e) {$this->error($e->getMessage());}}/*** 生成随机数页面,生成随机数** @ApiMethod (POST)* @ApiHeaders  (name=token, type=string, required=false, description="请求的Token")*/public function choujiang(){try {  $newchoujianginfo = (new ChoujiangModel())->where(['id'=>['>', 0]])->field('id,min_val,max_val,geshu,state,neidingcishu,content')->order('id desc')->find();$nextlunci = (new ChoujianglogModel)->getnextLunci($newchoujianginfo['id'], $this->yilunchoujiagcishu); //获取抽奖接下来的轮次$min = $newchoujianginfo['min_val'];$max = $newchoujianginfo['max_val'];$geshu = $newchoujianginfo['geshu'];$state = $newchoujianginfo['state'];    $neidingcishu = $newchoujianginfo['neidingcishu'];    // 当前轮次抽奖次数$choujiangcishu = (new ChoujianglogModel)->where(['choujiang_id'=>$newchoujianginfo['id'], 'lunci'=>$nextlunci])->group('sign')->count();if($choujiangcishu == 0){   //开始新一轮$numbers = [];   // 生成的数字$keyArr = [];   //内定数字// 优先将内定数字放入数组if($neidingcishu){foreach(json_decode($neidingcishu, true) as $key=>$value){// 生成数字$key,并确保满足条件($value次)for ($i = 0; $i < $value; $i++) {$numbers[] = $key;}$keyArr[] = $key;}}// 除去内定数字之外的数字集$shuziArr = array_values(array_diff(range($min, $max), $keyArr));// 填补,确保没有超出条件限制shuffle($shuziArr); // 打乱数组顺序$shuziArrwhile = $shuziArr;while (count($numbers) < $geshu*$this->yilunchoujiagcishu) {if(count($shuziArrwhile) <= 0){$shuziArrwhile = $shuziArr;}$shuzi = array_shift($shuziArrwhile);$numbers[] = $shuzi;}// 打乱数组顺序,确保随机性shuffle($numbers);// 允许重复:1=是,2=否if($state == 1){// 分割数组$newNumbers = array_chunk($numbers, $geshu);}else{$newNumbers = [];for ($i = 0; $i < count($numbers); $i += $geshu) {$randomarr = array_values(array_unique(array_slice($numbers, $i, $geshu)));if(count($randomarr) != $geshu){$this->error('抱歉,参数配置错误');}$newNumbers[] = $randomarr;}}$firstArr = array_shift($newNumbers);}else{$newNumbers = json_decode($newchoujianginfo['content'], true);$firstArr = array_shift($newNumbers);}// 保存抽奖记录$choujianglogModel = new ChoujianglogModel();$sign = $choujianglogModel->createSign();$logData = [];foreach($firstArr as $k=>$v){$logData[] = ['choujiang_id'=>$newchoujianginfo['id'], 'lunci'=>$nextlunci,'number'=>$v,'sign'=>$sign,];}$choujianglogModel->allowField(true)->saveAll($logData);// 保存剩余待抽奖项$newchoujianginfo->save(['content'=>json_encode($newNumbers)]);$this->success("OK", ['data' => $firstArr,]);} catch (Exception $e) {$this->error($e->getMessage());}}/*** 内定数字页面,获取数据** @ApiMethod (GET)* @ApiHeaders  (name=token, type=string, required=false, description="请求的Token")*/public function getChoujiangSet(){try {  $newchoujianginfo = $this->choujiangset();$this->success("OK", ['info' => $newchoujianginfo,]);} catch (Exception $e) {$this->error($e->getMessage());}}private function choujiangset() {$newchoujianginfo = (new ChoujiangModel())->where(['id'=>['>', 0]])->field('id,min_val,max_val,geshu,state,neidingcishu')->order('id desc')->find();$lunci = (new ChoujianglogModel)->getLunci($newchoujianginfo['id'], $this->yilunchoujiagcishu); //获取抽奖当前轮次$neidingcishu_arr = [];if($newchoujianginfo['neidingcishu']){foreach(json_decode($newchoujianginfo['neidingcishu'], true) as $k=>$v){$neidingcishu_arr[] = ['shuzi'=>$k,'cishu'=>$v,'chouzhongcishu'=>(new ChoujianglogModel)->where(['choujiang_id'=>$newchoujianginfo['id'], 'lunci'=>$lunci, 'number'=>$k])->count(),];}}$newchoujianginfo['neidingcishu_arr'] = $neidingcishu_arr;unset($newchoujianginfo['neidingcishu']);$newchoujianginfo['choujiangcishu'] = (new ChoujianglogModel)->where(['choujiang_id'=>$newchoujianginfo['id'], 'lunci'=>$lunci])->group('sign')->count();return $newchoujianginfo;}/*** 内定数字页面,设置出现次数** @ApiMethod (POST)* @ApiHeaders  (name=token, type=string, required=false, description="请求的Token")* @param json $neidingcishu  json字符串,例如{"1":"5","2":"3"}*/public function editChoujiangSet(){try {  $neidingcishu = htmlspecialchars_decode($this->request->post('neidingcishu/s', ''));$neidingcishu = json_decode($neidingcishu, true);// $neidingcishu = $this->request->post()['neidingcishu'];$choujianginfo = (new ChoujiangModel())->where(['id'=>['>', 0]])->order('id desc')->find();if($neidingcishu){$arr = [];$max_cishu = $this->yilunchoujiagcishu * $choujianginfo['geshu'];$cishu = 0;foreach($neidingcishu as $key=>$value){if($key < $choujianginfo['min_val'] || $key > $choujianginfo['max_val']){$this->error('数字应在最小数与最大数之间');}if($choujianginfo['state']==1 && $value > $max_cishu){$this->error('单个数字出现总次数应<='.$max_cishu);}if($choujianginfo['state']==2 && $value > $this->yilunchoujiagcishu){$this->error('单个数字出现总次数应<='.$this->yilunchoujiagcishu);}$cishu += $value;if($cishu > $max_cishu){$this->error('数字出现总次数应<='.$max_cishu);}$arr[$key] = $value;}if($choujianginfo['min_val']+1 == $choujianginfo['max_val'] && count($arr)==2 && $cishu != $max_cishu){$this->error('数字出现总次数应=='.$max_cishu);}$neidingcishu_str = json_encode($arr);}else{$neidingcishu_str = '';}if($choujianginfo['neidingcishu'] != $neidingcishu_str){$info = (new ChoujiangsetModel())->where(['id'=>['>', 0]])->field('min_val,max_val,geshu,state')->find();(new ChoujiangModel())->save(['min_val'=>$info['min_val'],'max_val'=>$info['max_val'],'geshu'=>$info['geshu'],'state'=>$info['state'],'neidingcishu'=>$neidingcishu_str,]);}$newchoujianginfo = $this->choujiangset();$this->success("保存成功", ['info' => $newchoujianginfo,]);} catch (Exception $e) {$this->error($e->getMessage());}}}

sql

CREATE TABLE `fa_choujiang_set` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',`min_val` int(10) DEFAULT '0' COMMENT '最小数',`max_val` int(10) DEFAULT '0' COMMENT '最大数',`geshu` int(10) DEFAULT '0' COMMENT '个数',`state` enum('1','2') DEFAULT '1' COMMENT '允许重复:1=是,2=否',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COMMENT='抽奖设置表';CREATE TABLE `fa_choujiang` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',`min_val` int(10) DEFAULT '0' COMMENT '最小数',`max_val` int(10) DEFAULT '0' COMMENT '最大数',`geshu` int(10) DEFAULT '0' COMMENT '个数',`state` enum('1','2') DEFAULT '1' COMMENT '允许重复:1=是,2=否',`neidingcishu` text COMMENT '内定次数',`content` text COMMENT '内容',`createtime` bigint(16) DEFAULT NULL COMMENT '创建时间',`updatetime` bigint(16) DEFAULT NULL COMMENT '更新时间',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8mb4 COMMENT='抽奖表';CREATE TABLE `fa_choujiang_log` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',`choujiang_id` int(10) DEFAULT '0' COMMENT '抽奖ID',`number` int(10) DEFAULT '0' COMMENT '数字',`sign` varchar(100) DEFAULT NULL COMMENT '标识',`lunci` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '轮次(第几轮)',`createtime` bigint(16) DEFAULT NULL COMMENT '创建时间',PRIMARY KEY (`id`),KEY `choujiang_id` (`choujiang_id`)
) ENGINE=InnoDB AUTO_INCREMENT=65 DEFAULT CHARSET=utf8mb4 COMMENT='抽奖记录表';

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/446397.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙--商品列表

这里主要利用的是 List 组件 相关概念 Scroll:可滚动的容器组件,当子组件的布局尺寸超过父组件的视口时,内容可以滚动。List:列表包

AI+若依框架day02

项目实战 项目介绍 帝可得是什么 角色和功能 页面原型 库表设计 初始AI AIGC 提示工程 Prompt的组成 Prompt练习 项目搭建 点位管理 需求说明 库表设计

浏览器中使用模型

LLM 参数越来越小&#xff0c;使模型跑在端侧成为可能&#xff0c;为什么要模型跑在端侧呢&#xff0c;首先可以节省服务器的算力&#xff0c;现在 GPU 的租用价格还是比较的高的&#xff0c;例如租用一个 A10 的卡1 年都要 3 万多。如果将一部分算力转移到端侧通过小模型进行计…

【LeetCode热题100】分治-快排

本篇博客记录分治快排的4道题目&#xff1a;颜色分类、排序数组、数组中的第K个最大元素、数组中最小的N个元素&#xff08;库存管理&#xff09;。 class Solution { public:void sortColors(vector<int>& nums) {int n nums.size();int left -1,right n;for(int…

React速成

useRef获取DOM 组件通讯 子传父 function Son({ onGetMsg }){const sonMsg this is son msgreturn (<div>{/* 在子组件中执行父组件传递过来的函数 */}<button onClick{()>onGetMsg(sonMsg)}>send</button></div>) }function App(){const getMsg…

Python基础常见面试题总结

文章目录 1.深拷贝与浅拷贝2.迭代器3.生成器4.装饰器5.进程、线程、协程6.高阶函数7.魔法方法8.python垃圾回收机制 1.深拷贝与浅拷贝 浅拷贝是对地址的拷贝&#xff0c;只拷贝第一层&#xff0c;第一层改变的时候不会改变&#xff0c;内层改变才会改变。深拷贝是对值的拷贝&a…

智能驾驶|迈向智能出行未来,AI如何应用在自动驾驶?

自动驾驶通过人工智能&#xff08;AI&#xff09;、机器学习、传感器融合和实时数据处理&#xff0c;使车辆能够在无需人类干预的情况下自主驾驶。随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;与智能汽车的结合正在成为现代交通运输领域的热潮。无人驾驶…

selenium-Alert类用于操作提示框/确认弹框(4)

之前文章我们提到&#xff0c;在webdriver.WebDriver类有一个switch_to方法&#xff0c;通过switch_to.alert()可以返回Alert对象&#xff0c;而Alert对象主要用于网页中弹出的提示框/确认框/文本输入框的确认或者取消等动作。 Alert介绍 当在页面定位到提示框/确认框/文本录入…

Flythings学习(二)控件相关

文章目录 1 前言2 通用属性2.1 控件ID值2.2 控件位置2.3 背景色2.4 背景图2.5 显示与隐藏2.6 控件状态2.7 蜂鸣器控制 3 文本类TextView4 按键类 Button4.1 系统按键4.2 处理按钮长按事件4.3 处理按键触摸事件 5 复选框CheckBox6 单选组 RadioGroup7 进度条&#xff0c;滑块7.1…

Ubuntu卸载Mysql【ubuntu 24.04/mysql 8.0.39】

一、准备工作 查看ubuntu版本号 查看mysql版本号(如果没有安装mysql,这一步省略) 二、Ubuntu上卸载mysql(如果没有安装mysql这一步省略) 在Ubuntu上卸载MySQL可以通过以下步骤进行&#xff0c;确保完全移除MySQL相关的包和数据&#xff1a; 1. 停止MySQL服务 在卸载之前…

verilog端口使用注意事项

下图存在组合逻辑反馈环&#xff0c;即组合逻辑的输出反馈到输入(赋值的左右2边存在相同的信号)&#xff0c;此种情况会造成系统不稳定。比如在data_in20的情况下&#xff0c;在data_out0 时候&#xff0c;输出的数据会反馈到输入&#xff0c;输入再输出&#xff0c;从而造成不…

java项目之基于vue的工厂车间管理系统的设计源码(springboot+mysql+vue)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的基于vue的工厂车间管理系统的设计。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 基于vu…

QT开发--多线程

第十四章 多线程 QThread 是 Qt 中实现多线程编程的核心类&#xff0c;提供跨平台线程管理。 使用 QThread 有两种方法&#xff1a; 1、 继承 QThread&#xff1a;重写 run() 方法&#xff0c;实现线程的具体操作。Qt4.8 之前较常用。 2、 使用 QObject 和 moveToThread()&…

树莓派应用--AI项目实战篇来啦-17.YOLOv8目标检测-安全帽检测

1. YOLOv8介绍 YOLOv8是Ultralytics公司2023年推出的Yolo系列目标检测算法&#xff0c;可以用于图像分类、物体检测和实例分割等任务。YOLOv8作为YOLO系列算法的最新成员&#xff0c;在损失函数、Anchor机制、样本分配策略等方面进行了全面优化和创新。这些改进不仅提高了模型的…

深入理解Transformer的笔记记录(精简版本)NNLM → Word2Vec

文章的整体介绍顺序为: NNLM → Word2Vec → Seq2Seq → Seq2Seq with Attention → Transformer → Elmo → GPT → BERT 自然语言处理相关任务中要将自然语言交给机器学习中的算法来处理,通常需要将语言数学化,因为计算机机器只认数学符号。向量是人把自然界的东西抽象出…

iOS 14 自定义画中画悬浮窗 Custom AVPictureInPictureController 实现方案

iOS 14&#xff0c;基于 AVPictureInPictureController&#xff0c;实现自定义画中画&#xff0c;涵盖所有功能与难点。 市面上的各种悬浮钟和提词器的原理都是基于此。 Demo源码在文末。 使用 iOS 画中画的要求&#xff1a; 真机&#xff0c;不能使用模拟器&#xff1b;iO…

Android平台RTSP|RTMP播放器PK:VLC for Android还是SmartPlayer?

好多开发者&#xff0c;希望在Android端低延迟的播放RTMP或RTSP流&#xff0c;本文就目前市面上主流2个直播播放框架&#xff0c;做个简单的对比。 VLC for Android VLC for Android 是一款功能强大的多媒体播放器&#xff0c;具有以下特点和功能&#xff1a; 广泛的格式支持…

FFmpeg的简单使用【Windows】--- 简单的视频混合拼接

实现功能 点击【选择文件】按钮在弹出的对话框中选择多个视频&#xff0c;这些视频就是一会将要混剪的视频素材&#xff0c;点击【开始处理】按钮之后就会开始对视频进行处理&#xff0c;处理完毕之后会将处理后的文件路径返回&#xff0c;并在页面展示处理后的视频。 视频所…

MySQL-08.DDL-表结构操作-创建-案例

一.MySQL创建表的方式 1.首先根据需求文档定义出原型字段&#xff0c;即从需求文档中可以直接设计出来的字段 2.再在原型字段的基础上加上一些基础字段&#xff0c;构成整个表结构的设计 我们采用基于图形化界面的方式来创建表结构 二.案例 原型字段 各字段设计如下&…

JAVA就业笔记4——第二阶段(1)

课程须知 A类知识&#xff1a;工作和面试常用&#xff0c;代码必须要手敲&#xff0c;需要掌握。 B类知识&#xff1a;面试会问道&#xff0c;工作不常用&#xff0c;代码不需要手敲&#xff0c;理解能正确表达即可。 C类知识&#xff1a;工作和面试不常用&#xff0c;代码不…