回答編集履歴

3

調整

2022/01/17 05:53

投稿

yambejp
yambejp

スコア114784

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=new Map;
17
+ const ret={};
16
18
  const retry=1000;
17
19
  do{
18
20
  tmp_num=num;
19
- ret.set('len',0);
21
+ ret.len=0;
20
- ret.set('retry',0);
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.set(i,tmp_i);
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.set('retry',counta);
30
+ ret['retry']=counta;
29
31
 
30
- }while(len!=null && ![0,1].includes(len - ret.get('len')));
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.get(x+1)).fill(x+1)).flat().map(x=>[x,Math.random()]).sort((x,y)=>x[1]-y[1]).map(x=>x[0]);
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.get('len'));
44
+ const c3=chusen(num,cnt,c1.len);
45
+ console.log(c3);
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]);
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
- console.log(res.flat());
57
+ </script>
51
58
  ```
52
-
59
+ 調整しました

2

調整

2022/01/17 05:32

投稿

yambejp
yambejp

スコア114784

test CHANGED
@@ -8,12 +8,12 @@
8
8
  ```javascript
9
9
  const num=50;
10
10
  const cnt=3;
11
- const chusen=(num,cnt,sum=null)=>{
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(sum!=null && ![0,1].includes(sum - ret.get('len')));
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

サンプル

2022/01/17 05:08

投稿

yambejp
yambejp

スコア114784

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
+