firelsas 發表於 2018-5-5 15:16:31

求解~抽籤

目的:籤筒有42支籤,號碼1~6,7組,
        例如1號被選取7次後就不在出現
目前進度:學會亂數,但部會設限

int sw=A0;
int a;
boolean swstatus=true;

void setup(){
pinMode(sw,INPUT);
digitalWrite(sw,HIGH);
Serial.begin(115200);
}

void loop(){
if(digitalRead(sw)==HIGH && swstatus==true){
a=random(1,6);
Serial.println(a);
swstatus=false;
}
else if (digitalRead(sw)==LOW && swstatus==false){
swstatus=true;
}
delay(200);
}

超新手 發表於 2018-5-5 16:01:00

1. 簡單方法
宣告一個6bytes的陣列, 初始值都是7
如果抽到某個數字,就看該陣列值是否為0
如果是0,就重抽,否則就把值減 1


2. 複雜方法
宣告一個42bytes的陣列
初始值 前 7個是 1,再來 7 個是 2...最後7個是 6
第一次取 0~41 的亂數,例如2,得到陣列值為1
再拿陣列尾端41的值和抽中的值交換,
所以陣列2的值變成6
第二次取 0~40 的亂數,例如39,得到陣列值為6
再拿陣列尾端40的值和抽中的值交換,
所以陣列39的值變成6
第三次取 0~39 的亂數,
再拿陣列尾端39的值和抽中的值交換
第四次取 0~38 的亂數,
再拿陣列尾端38的值和抽中的值換
........
第42次直接取陣列0 的值

firelsas 發表於 2018-5-5 16:06:50

筆記....自學中,還沒學到陣列,等學到再研究。

超新手 發表於 2018-5-5 16:12:38

本帖最後由 超新手 於 2018-5-5 20:00 編輯

或是用洗牌方法
宣告一個 42 bytes陣列
初始值 7個1,7個2...7個6
先選2個 0到 41的亂數,把這兩個值當指標的
陣列值互換, 依此方式連續做個幾百次,
就算洗牌完成
然後依次輸出陣列第 0筆到第41筆的值即可
頁: [1]
查看完整版本: 求解~抽籤