回答編集履歴
3
調整
test
CHANGED
@@ -6,28 +6,30 @@
|
|
6
6
|
# sample
|
7
7
|
ロジックの質問なのでjsでサンプル提示します
|
8
8
|
```javascript
|
9
|
+
<div id="view" style="word-break:break-all;"></div>
|
10
|
+
<script>
|
9
11
|
const num=50;
|
10
12
|
const cnt=3;
|
11
13
|
const chusen=(num,cnt,len=null)=>{
|
12
14
|
let tmp_i;
|
13
15
|
let tmp_num;
|
14
16
|
let counta=0;
|
15
|
-
const ret=
|
17
|
+
const ret={};
|
16
18
|
const retry=1000;
|
17
19
|
do{
|
18
20
|
tmp_num=num;
|
19
|
-
ret.
|
21
|
+
ret.len=0;
|
20
|
-
ret.
|
22
|
+
ret.retry=0;
|
21
23
|
for(let i=cnt;i>=1;i--){
|
22
24
|
tmp_i=(i>1)?parseInt(Math.random()*parseInt(tmp_num/i)):tmp_num;
|
25
|
+
ret[i]=tmp_i;
|
23
|
-
ret.
|
26
|
+
ret.len+=tmp_i;
|
24
|
-
ret.set('len',(ret.get('len')|0)+tmp_i);
|
25
27
|
tmp_num-=tmp_i*i;
|
26
28
|
}
|
27
29
|
if(counta++>=retry) return null;
|
28
|
-
ret
|
30
|
+
ret['retry']=counta;
|
29
31
|
|
30
|
-
}while(len!=null && ![0,1].includes(len - ret.
|
32
|
+
}while(len!=null && ![0,1].includes(len - ret.len));
|
31
33
|
return ret;
|
32
34
|
};
|
33
35
|
const res=[];
|
@@ -36,9 +38,13 @@
|
|
36
38
|
even:Array(num).fill(null).map((_,x)=>[x*2+2,Math.random()]).sort((x,y)=>x[1]-y[1]).map(x=>x[0]),
|
37
39
|
};
|
38
40
|
const c1=chusen(num,cnt);
|
41
|
+
console.log(c1);
|
39
|
-
const c2=Array(cnt).fill(null).map((_,x)=>Array(c1
|
42
|
+
const c2=Array(cnt).fill(null).map((_,x)=>Array(c1[x+1]).fill(x+1)).flat().map(x=>[x,Math.random()]).sort((x,y)=>x[1]-y[1]).map(x=>x[0]);
|
43
|
+
console.log(c2);
|
40
|
-
const c3=chusen(num,cnt,c1.
|
44
|
+
const c3=chusen(num,cnt,c1.len);
|
45
|
+
console.log(c3);
|
41
|
-
const c4=Array(cnt).fill(null).map((_,x)=>Array(c3
|
46
|
+
const c4=Array(cnt).fill(null).map((_,x)=>Array(c3[x+1]).fill(x+1)).flat().map(x=>[x,Math.random()]).sort((x,y)=>x[1]-y[1]).map(x=>x[0]);
|
47
|
+
console.log(c4);
|
42
48
|
|
43
49
|
let choice=Math.random()<0.5?"odd":"even";
|
44
50
|
for(var i=0;i<c2.length;i++){
|
@@ -47,6 +53,7 @@
|
|
47
53
|
choice=choice=="odd"?"even":"odd";
|
48
54
|
});
|
49
55
|
}
|
56
|
+
view.textContent=res.flat().join(',');
|
50
|
-
c
|
57
|
+
</script>
|
51
58
|
```
|
52
|
-
|
59
|
+
調整しました
|
2
調整
test
CHANGED
@@ -8,12 +8,12 @@
|
|
8
8
|
```javascript
|
9
9
|
const num=50;
|
10
10
|
const cnt=3;
|
11
|
-
const chusen=(num,cnt,
|
11
|
+
const chusen=(num,cnt,len=null)=>{
|
12
12
|
let tmp_i;
|
13
13
|
let tmp_num;
|
14
14
|
let counta=0;
|
15
15
|
const ret=new Map;
|
16
|
-
const retry=1000;
|
16
|
+
const retry=1000;
|
17
17
|
do{
|
18
18
|
tmp_num=num;
|
19
19
|
ret.set('len',0);
|
@@ -26,20 +26,21 @@
|
|
26
26
|
}
|
27
27
|
if(counta++>=retry) return null;
|
28
28
|
ret.set('retry',counta);
|
29
|
+
|
29
|
-
}while(
|
30
|
+
}while(len!=null && ![0,1].includes(len - ret.get('len')));
|
30
31
|
return ret;
|
31
32
|
};
|
32
33
|
const res=[];
|
33
34
|
const list={
|
34
|
-
odd:Array(num).fill(null).map((_,x)=>[x*2+1,Math.random()]).sort((x,y)=>x[1]-y[1]).map(x=>x[0]),
|
35
|
+
odd:Array(num).fill(null).map((_,x)=>[x*2+1,Math.random()]).sort((x,y)=>x[1]-y[1]).map(x=>x[0]),
|
35
|
-
even:Array(num).fill(null).map((_,x)=>[x*2+2,Math.random()]).sort((x,y)=>x[1]-y[1]).map(x=>x[0]),
|
36
|
+
even:Array(num).fill(null).map((_,x)=>[x*2+2,Math.random()]).sort((x,y)=>x[1]-y[1]).map(x=>x[0]),
|
36
37
|
};
|
37
38
|
const c1=chusen(num,cnt);
|
38
39
|
const c2=Array(cnt).fill(null).map((_,x)=>Array(c1.get(x+1)).fill(x+1)).flat().map(x=>[x,Math.random()]).sort((x,y)=>x[1]-y[1]).map(x=>x[0]);
|
39
40
|
const c3=chusen(num,cnt,c1.get('len'));
|
40
41
|
const c4=Array(cnt).fill(null).map((_,x)=>Array(c3.get(x+1)).fill(x+1)).flat().map(x=>[x,Math.random()]).sort((x,y)=>x[1]-y[1]).map(x=>x[0]);
|
42
|
+
|
41
43
|
let choice=Math.random()<0.5?"odd":"even";
|
42
|
-
|
43
44
|
for(var i=0;i<c2.length;i++){
|
44
45
|
[c2,c4].forEach(x=>{
|
45
46
|
if(tmp=list[choice].splice(0,x[i])) res.push(tmp);
|
1
サンプル
test
CHANGED
@@ -2,3 +2,50 @@
|
|
2
2
|
の順で処理すればいいでしょう。
|
3
3
|
偶数と奇数をそれぞれ配列に抽出してシャッフルして順番に抜き出す感じです。
|
4
4
|
4つ以上続かないという条件をつけた時点ですでにランダム性は損なわれています
|
5
|
+
|
6
|
+
# sample
|
7
|
+
ロジックの質問なのでjsでサンプル提示します
|
8
|
+
```javascript
|
9
|
+
const num=50;
|
10
|
+
const cnt=3;
|
11
|
+
const chusen=(num,cnt,sum=null)=>{
|
12
|
+
let tmp_i;
|
13
|
+
let tmp_num;
|
14
|
+
let counta=0;
|
15
|
+
const ret=new Map;
|
16
|
+
const retry=1000;//最大再抽選回数(保険で多めにしてあります)
|
17
|
+
do{
|
18
|
+
tmp_num=num;
|
19
|
+
ret.set('len',0);
|
20
|
+
ret.set('retry',0);
|
21
|
+
for(let i=cnt;i>=1;i--){
|
22
|
+
tmp_i=(i>1)?parseInt(Math.random()*parseInt(tmp_num/i)):tmp_num;
|
23
|
+
ret.set(i,tmp_i);
|
24
|
+
ret.set('len',(ret.get('len')|0)+tmp_i);
|
25
|
+
tmp_num-=tmp_i*i;
|
26
|
+
}
|
27
|
+
if(counta++>=retry) return null;
|
28
|
+
ret.set('retry',counta);
|
29
|
+
}while(sum!=null && ![0,1].includes(sum - ret.get('len')));
|
30
|
+
return ret;
|
31
|
+
};
|
32
|
+
const res=[];
|
33
|
+
const list={
|
34
|
+
odd:Array(num).fill(null).map((_,x)=>[x*2+1,Math.random()]).sort((x,y)=>x[1]-y[1]).map(x=>x[0]),
|
35
|
+
even:Array(num).fill(null).map((_,x)=>[x*2+2,Math.random()]).sort((x,y)=>x[1]-y[1]).map(x=>x[0]),
|
36
|
+
};
|
37
|
+
const c1=chusen(num,cnt);
|
38
|
+
const c2=Array(cnt).fill(null).map((_,x)=>Array(c1.get(x+1)).fill(x+1)).flat().map(x=>[x,Math.random()]).sort((x,y)=>x[1]-y[1]).map(x=>x[0]);
|
39
|
+
const c3=chusen(num,cnt,c1.get('len'));
|
40
|
+
const c4=Array(cnt).fill(null).map((_,x)=>Array(c3.get(x+1)).fill(x+1)).flat().map(x=>[x,Math.random()]).sort((x,y)=>x[1]-y[1]).map(x=>x[0]);
|
41
|
+
let choice=Math.random()<0.5?"odd":"even";
|
42
|
+
|
43
|
+
for(var i=0;i<c2.length;i++){
|
44
|
+
[c2,c4].forEach(x=>{
|
45
|
+
if(tmp=list[choice].splice(0,x[i])) res.push(tmp);
|
46
|
+
choice=choice=="odd"?"even":"odd";
|
47
|
+
});
|
48
|
+
}
|
49
|
+
console.log(res.flat());
|
50
|
+
```
|
51
|
+
|