สุ่มเลือกจากอาร์เรย์


19

ความท้าทายนี้ค่อนข้างง่าย:
คุณจะได้รับอาร์เรย์จำนวนเต็มบวก (ไม่รวม 0) และต้องเลือกองค์ประกอบแบบสุ่มจากอาร์เรย์นี้

แต่นี่คือความบิดเบี้ยว:
ความน่าจะเป็นของการเลือกองค์ประกอบขึ้นอยู่กับค่าของจำนวนเต็มซึ่งหมายความว่าเมื่อจำนวนเต็มที่โตขึ้นความน่าจะเป็นของการเลือกองค์ประกอบก็เป็นเช่นกัน!

ตัวอย่าง

[4, 1, 5]คุณจะได้รับอาร์เรย์

ความน่าจะเป็นของการเลือก 4 เท่ากับ4 หารด้วยผลรวมขององค์ประกอบทั้งหมดในอาร์เรย์ในกรณี4 / ( 4 + 1 + 5 ) = 4 / 10 =40%นี้
ความน่าจะเป็นของการเลือก 1 หรือ1 / 1010%

อินพุต

อาร์เรย์ของจำนวนเต็มบวก

เอาท์พุต

stdoutกลับจำนวนเต็มเลือกถ้าใช้วิธีการหรือโดยตรงพิมพ์ไป

กฎระเบียบ

  • นี่คือสั้นที่สุดในหน่วยไบต์ในภาษาใด ๆ ที่ชนะ
  • ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม

คำตอบ:


20

เยลลี่ 3 ไบต์

x`X

ลองออนไลน์!

ดูสิไม่มี Unicode!

คำอธิบาย:

x`X
 `  Make monad from dyad and use same left and right arguments
x   Repeat each element of the left argument (implicit) list its respective number of times in the right argument list
  X Random element

1
คุณช่วยอธิบายรหัสของคุณได้ไหม :)
เอียนเอช

1
@IanH จริงๆแล้วมันเป็นอัลกอริธึมที่ง่าย ๆ ในการทำซ้ำแต่ละองค์ประกอบด้วยตัวเองแล้วเลือกแบบสุ่ม
Erik the Outgolfer

16

R , 25 ไบต์

function(s)sample(s,1,,s)

ลองออนไลน์!

คำอธิบาย:

function(s){
 sample(x = s, size = 1, replace = FALSE, prob = s)
}

นำตัวอย่างจากsขนาด1โดยไม่ต้องเปลี่ยนด้วยน้ำหนักs; สิ่งเหล่านี้ได้รับการลดความน่าจะเป็น

เพื่อตรวจสอบการกระจายใช้ลิงค์นี้


คุณเอาชนะฉันไปได้ภายใน 9 เดือน! : D
JayCe

@ JayCe เฮ้ประโยชน์เพียงอย่างเดียวของฉันมากกว่าคุณดูเหมือนจะ "ไปก่อน" ในขณะที่คุณค่อนข้างนักกอล์ฟ! :-)
จูเซปเป้

13

Pyth , 4 ไบต์

OsmR

ลองที่นี่

บันทึกหนึ่งไบต์ต้องขอบคุณ @Jakube ด้วยวิธีการที่ค่อนข้างผิดปกติ

Pyth , 5 ไบต์

Osm*]

ลองที่นี่!

อย่างไร?

# 1

OsmR - โปรแกรมเต็มรูปแบบ

   R - แผนที่ที่ถูกต้อง ...
  m - ... ใช้แผนที่ สิ่งนี้จะสร้างรายการ [[4,4,4,4], [1], [5,5,5,5,5]]
       - ... เครดิตไปที่ Jakube เพื่อสิ่งนี้!
 s - แบน
O - องค์ประกอบสุ่มของ ^ แสดงผลโดยนัย

# 2

Osm *] - โปรแกรมเต็มรูปแบบ

  m - แผนที่เหนืออินพุต
    ] - องค์ประกอบปัจจุบัน, d, ห่อ; [D]
   * - ซ้ำ d ครั้ง
 s - แบน
O - องค์ประกอบแบบสุ่ม พิมพ์ผลลัพธ์โดยปริยาย

1
ฉันทำได้ใน 4 ฉันควรทำให้เสียหรือคุณต้องการค้นหาด้วยตัวเอง?
Jakube

2
@ Jakube รอหน่อย ต้องการดูว่าฉันสามารถทำมันได้ มันเป็นเรื่องที่เห็นได้ชัด?
Mr. Xcoder

1
@ Jakube ตกลงฉันจะ ping เมื่อฉันยอมแพ้
Mr. Xcoder

1
OsmLหรือOsmR
Jakube

1
@Jakube Ooh ฉลาดมาก! อาร์กิวเมนต์โดยนัยdจากนั้นแมปdในช่วง ... อัจฉริยะ!
Erik the Outgolfer

8

CJam (9 ไบต์)

q~_]ze~mR

สาธิตออนไลน์ นี่เป็นโปรแกรมเต็มรูปแบบที่รับอินพุตในรูปแบบอาร์เรย์ CJam บน stdin และพิมพ์องค์ประกอบที่เลือกไปยัง stdout

การผ่า

q~   e# Read and parse input
_]z  e# Copy and transpose
e~   e# Run-length decode
mR   e# Select random element uniformly

1
สนามกอล์ฟที่ทรงพลังสำหรับงานง่ายๆ
Erik the Outgolfer

7

Perl 6 , 20 ไบต์

บันทึกแล้ว 1 ไบต์ขอบคุณ @Brad Gilbert b2gills

{bag(@_ Zxx@_).pick}

ลองออนไลน์!

อาร์กิวเมนต์นี้ใช้เวลา 1 รายการ เราซิปรายการนี้ 2 รายการโดยใช้xxโอเปอเรเตอร์ ดังนั้นด้วยความ@_ Zxx@_ที่เราได้รับรายชื่อในการที่องค์ประกอบxที่จะนำเสนอxครั้ง จากนั้นจะถูกบังคับให้ทำBagซึ่งเป็นคอลเล็กชันที่เก็บวัตถุพร้อมกับจำนวนครั้งที่ปรากฏในคอลเล็กชัน ในที่สุดเราเลือกองค์ประกอบแบบสุ่มจากคอลเล็กชันนี้ด้วยpickซึ่งจะนับจำนวนลงในบัญชีและทำสิ่งที่ถูกต้อง™


สิ่งนี้สามารถย่อให้เล็กลงได้{bag(@_ Z=>@_).pick}
แบรดกิลเบิร์ต b2gills

@ BradGilbertb2gills น่าเศร้าที่ไม่ได้ผล มันทำถุงจากคู่ (ดังนั้นจะไม่ "1" ครั้งเดียว "2" สองครั้ง ฯลฯ แต่ "1 => 1" ครั้งเดียว "2 => 2" เช่นกันครั้งเดียว - ไม่ใช่สิ่งที่ฉันต้องการ) . นั่นเป็นเพราะผู้แต่งไม่ใช่ผู้ข่มขู่ตามที่อธิบายไว้ในปฏิทินจุตินี้
Ramillies

@ BradGilbertb2gills แต่ขอบคุณอยู่ดีคุณช่วยให้ฉันออกไปเล่นกอล์ฟที่นี่และในความท้าทายอื่น ๆ ด้วย!
Ramillies

ฉันหมายถึง{bag(@_ Zxx@_).pick}
แบรดกิลเบิร์ต b2gills

ฉันรู้แล้ว ทำไมมันไม่เกิดขึ้นกับฉัน ... : -) ขอบคุณ
Ramillies






4

Java (OpenJDK 8) , 88 87 86 83 ไบต์

a->{int r=0,x=-1;for(int i:a)r-=i;for(r*=Math.random();r<1;)r+=a[++x];return a[x];}

ลองออนไลน์!


คุณสามารถเพิ่มคำอธิบายได้ไหม? ฉันพยายามที่จะเข้าใจว่าทำไมเป็นสิ่งจำเป็นหรือถ้าทั้งหมดที่คุณต้องการfor(r*=Math.random();;) r*=Math.random()
Ayb4btu

@ Ayb4btu หากไม่มีการfor(;;)วนซ้ำสิ่งนี้จะต้องใช้คำสั่ง return ที่สอง (ไม่เคยไปถึง) หลังจากfor(int i:a)...เพื่อให้เป็นไปตามคอมไพเลอร์ - ซึ่งจะยาวกว่า 3 ไบต์
Nevay

อ่าแน่นอนคุณfor(int i:a)เป็นเหมือนforeachC # ฉันมีปัญหาเดียวกัน แต่เพียงใช้forลูปที่ต่อเนื่อง คำตอบใหม่ของคุณทำให้ฉันประหลาดใจฉันอาจลองและคิดแนวคิดของคุณ
Ayb4btu

3

J, 8 7 8 ไบต์

7 byter ไม่ถูกต้อง ฉันจะกลับไปใช้การแก้ไขก่อนหน้าเมื่อฉันกลับไปที่คอมพิวเตอร์ภายในหนึ่งหรือสองวัน

ลองออนไลน์!

?@+/{#~

:( การเลือกองค์ประกอบแบบสุ่มจากอาร์เรย์มีค่าใช้จ่ายสูง

8 ไบต์

#~{~1?+/

9 ไบต์

(1?+/){#~

คำอธิบาย

?@+/{#~
?        Choose random number in range
  +/     Sum of the array
    {    Select that element from
     #~  The elements duplicated as many times as their value

?@+/คือ(?@+)/; ฉันเกรงว่าคุณจะต้องทุบตีมันอีกครั้งถึง 8 อีกครั้ง ...
FireFly

@FireFly ฉันควรทดสอบมากกว่านี้ดีกว่านี้
โคล

3

JavaScript (ES6), 50 ไบต์

a=>a.sort((a,b)=>b-a)[Math.random()**2*a.length|0]

หวังว่ามันชัดเจนว่ามันใช้งานได้อย่างไร แต่ฉันจะอธิบายที่นี่ต่อไป มันเรียงลำดับจำนวนเต็มในลำดับถัดลงมาแล้วเลือกหนึ่งที่สุ่มกับกระจายเบต้า (1 / 2,1)


ฉันไม่คิดว่านี่จะมีการกระจายที่ถูกต้อง การทดสอบของฉันแสดงว่าด้วยa=[4,1,5]คุณจะได้รับประมาณ 18% 1, 24% 4และ 58% 5ซึ่งแสดงให้เห็นว่าคุณจะได้รับการแจกแจงแบบนั้นด้วยการป้อนความยาว 3 ใด ๆ
Giuseppe

ดูเหมือนว่าถูกต้องสำหรับฉัน จำนวนเต็มที่สูงกว่าความน่าจะเป็นที่สูงขึ้น
kamoroso94

อ้อเข้าใจแล้ว. ฉันอ่านคำถามผิด ทางออกที่ดีเยี่ยม +1!
Giuseppe


2

PowerShellขนาด 27 ไบต์

($args[0]|%{,$_*$_})|Random

ลองออนไลน์!

รับอินพุต$args[0]เป็นอาร์เรย์ตัวอักษร ลูปผ่านแต่ละองค์ประกอบ|%{...}และแต่ละย้ำสร้างอาร์เรย์ใหม่,$_ของ$_องค์ประกอบ - เช่นสำหรับการนี้จะสร้างอาร์เรย์4 @(4,4,4,4)องค์ประกอบอาเรย์เหล่านั้นจะถูกไพพ์ไปGet-Randomซึ่งจะดึงองค์ประกอบหนึ่งออกมาพร้อมกับความน่าจะเป็น (หลอก) ที่เท่ากัน เนื่องจากเช่นสำหรับ@(4,1,5)สิ่งนี้ทำให้เรา@(4,4,4,4,1,5,5,5,5,5)ตรงตามข้อกำหนดความน่าจะเป็น


2

C # (. NET Core) , 93 89 87 76 + 18 = 94 ไบต์

a=>{int i=-1,r=new Random().Next(a.Sum());while(r>=0)r-=a[++i];return a[i];}

ลองออนไลน์!

เพิ่มอีก 18 ไบต์สำหรับ using System.Linq;

กิตติกรรมประกาศ

ช่วยให้ประหยัด 11 ไบต์ด้วย Nevay ซึ่งมีการใช้ตัวเลขแบบสุ่มมีความรัดกุมมากขึ้น (รวมถึงการใช้intแทนdouble)

Degolfed

a=>{
    int i=-1,
    r=new Random().Next(a.Sum());
    while(r>=0)
        r-=a[++i];
    return a[i];
}

คำอธิบาย

รับตัวเลขสุ่มrระหว่าง 0 ถึงผลรวมขององค์ประกอบ rแล้วที่แต่ละซ้ำลบองค์ประกอบปัจจุบันจาก ถ้าrน้อยกว่า0ให้ส่งคืนองค์ประกอบนี้ แนวคิดคือมีส่วนที่ใหญ่กว่าของหมายเลขสุ่มสำหรับตัวเลขที่ใหญ่กว่าในอาร์เรย์


94 ไบต์:a=>{int i=-1,r=new Random().Next(a.Sum());for(;r>=0;)r-=a[++i];return a[i];}
Nevay

2

Japtap , 7 ไบต์

ËÆD
c ö

ทดสอบที่นี่


คำอธิบาย

Uการป้อนข้อมูลโดยปริยายของอาร์เรย์

Ë

แผนที่เหนืออาร์เรย์ผ่านแต่ละองค์ประกอบผ่านฟังก์ชั่นที่Dเป็นองค์ประกอบปัจจุบัน

ÆD

สร้างอาร์เรย์ของความยาวและกรอกด้วยDD

c

เรียบ.

ö

รับองค์ประกอบแบบสุ่ม



1

Perl, 31 ไบต์

@a=map{($_)x$_}@ARGV;$a[rand@a]

นี่ถือว่าอินพุตเป็นอาร์กิวเมนต์บรรทัดคำสั่ง โปรดทราบว่าอาจมีหน่วยความจำไม่เพียงพอ




1

ถ่าน 12 ไบต์

F⪪θ;FIι⊞υι‽υ

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด เนื่องจากถ่านพยายามฉลาดเกินไปฉันต้องใช้อินพุตเซมิโคลอนคั่นด้วยอาเรย์ คำอธิบาย:

  θ             Input variable as string
 ⪪ ;            Split on semicolons
F               Loop i over each string
     Iι         Cast i to integer
    F           Repeat that many times
       ⊞υι      Push i to (originally empty) list
          ‽υ    Random selection from list
                Implicitly print


1

Javascript (ES6), 61 54 ไบต์

-7 ไบต์ขอบคุณ @Justin Mariner

a=>a.find(m=>(n-=m)<0,n=Math.random()*eval(a.join`+`))

ตัวอย่างโค้ด

f=
a=>a.find(m=>(n-=m)<0,n=Math.random()*eval(a.join`+`))
console.log(f([4,1,5]))


คุณสามารถสรุปโดยใช้แทนeval(a.join`+`) reduce
Justin Mariner

หากคุณใช้ได้กับ ES7 + คุณสามารถใช้: [].find(m=>(n-=m)<0,n=Math.random()*eval(a.join+ ))และโทรด้วยinput::[].find(...)
Downgoat

1

Haskell , 78 77 ไบต์

import System.Random
f l=randomRIO(0,sum l-1)>>=pure.((l>>= \n->n<$[1..n])!!)

ลองออนไลน์! ตัวอย่างการใช้งานอาจจะเป็นอัตราผลตอบแทนf [1,99]99

คำอธิบาย:

  • fรับรายการของจำนวนเต็มและส่งกลับจำนวนเต็มสุ่มเลือกเป็นlIO Int
  • l>>= \n->n<$[1..n]สร้างรายการที่มีองค์ประกอบnซ้ำแต่ละnครั้ง
  • randomRIO(0,sum l-1) ผลผลิตจำนวนเต็มในช่วงจาก 0 ถึงความยาวของรายการองค์ประกอบที่ซ้ำกันซึ่งเป็นผลรวมขององค์ประกอบทั้งหมดอย่างแน่นอนลบหนึ่งเพื่อหลีกเลี่ยงข้อยกเว้นที่ถูกผูกไว้

โบนัส: 85 เวอร์ชันที่ไม่มีจุดเป็นไบต์

import System.Random
(>>=).randomRIO.(,)0.pred.sum<*>(pure.).(!!).(>>= \n->n<$[1..n])

ลองออนไลน์!


1

ทุบตี , 51 ไบต์

for n in $@;{ printf $n\\n%.s `seq $n`;}|shuf|sed q

รับอินพุตที่คั่นด้วยช่องว่างหรือขึ้นบรรทัดใหม่คั่นในอาร์กิวเมนต์เดียวหรือหลายอาร์กิวเมนต์

ลองออนไลน์!

ตรวจสอบความถี่สุ่มด้วยกรณีทดสอบที่ซับซ้อนมากขึ้น


1

Java 8, 127 122 121 ไบต์

import java.util.*;a->{List l=new Stack();for(int i:a)for(int j=i;j-->0;Collections.shuffle(l))l.add(i);return l.get(0);}

-1 ไบต์ขอบคุณ@Nevay @Nevay

ใช้วิธีการที่คล้ายกันกับคำตอบ Jelly ของ@ErikTheOutgolferโดยการเพิ่มnเวลาในรายการnจากนั้นเลือกหนึ่งรายการแบบสุ่มจากรายการนั้น

คำอธิบาย:

ลองที่นี่

import java.util.*;        // Required import for List, Stack and Collections
a->{                       // Method with integer-array parameter and integer return-type
  List l=new Stack();      //  Create a List
  for(int i:a)             //  Loop (1) over the input array
    for(int j=i;j-->0;     //   Inner loop (2) from `i` down to 0
        Collections.shuffle(l))
                           //   and shuffle the List randomly after every iteration
      l.add(i);            //    Add `i` that many times to List `l`
                           //   End of inner loop (2) (implicit / single-line body)
                           //  End of loop (1) (implicit / single-line body)
  return l.get(0);         //  And then return the first item of the list
}                          // End of method

1
คุณสามารถย้าย#shuffleโทรเข้าไปในห่วงที่จะบันทึก 1 for(int j=i;j-->0;Collections.shuffle(l))l.add(i);ไบต์
Nevay

@Nevay ขอบคุณ! การสับเปลี่ยนรายการหลังจากการทำซ้ำทุกครั้งจะไม่มีประสิทธิภาพ แต่สิ่งที่เราสนใจเกี่ยวกับประสิทธิภาพคำเตือนและสิ่งที่เราสามารถกำจัดได้อีกหนึ่งไบต์ที่น่ารำคาญ ; p
Kevin Cruijssen


1

GNU APL 1.2, 26 23 ไบต์; 1.7 21 19 ไบต์

วิธีการแรงบันดาลใจจากเอริก Outgolfer คำตอบของวุ้น พึ่งพา⎕IOการเป็น 0 แทน 1 ซึ่งเป็นค่าเริ่มต้นสำหรับ GNU APL (เรียงลำดับจาก +5 ไบต์⎕IO←0)

-3, -2 ไบต์ขอบคุณ @ Zacharý

รูปแบบฟังก์ชั่น

∇f R
S[?⍴S←∊0 0⍉R∘.⍴R]∇

แบบฟอร์มแลมบ์ดานิรนาม

{S[?⍴S←∊0 0⍉⍵∘.⍴⍵]}

สำหรับคำอธิบายฉันจะใช้เพื่อเป็นตัวแทนของอาร์กิวเมนต์ที่ส่งผ่านไปยังฟังก์ชัน แต่มันจะเทียบเท่ากับRในรูปแบบ

⍵∘.⍴⍵คำนวณผลิตภัณฑ์ด้านนอกในรายการโดยใช้ตัวดำเนินการ reshape ( ) อย่างมีประสิทธิภาพสิ่งนี้จะสร้างตาราง (เช่นตารางการคูณ) แต่แทนที่จะเป็นการคูณมันจะทำซ้ำองค์ประกอบในคอลัมน์ตามจำนวนครั้งที่เท่ากับองค์ประกอบในแถว สำหรับตัวอย่างที่ให้ไว้ในคำถามนี่คือ:

4 4 4 4    1 1 1 1    5 5 5 5   
4          1          5         
4 4 4 4 4  1 1 1 1 1  5 5 5 5 5

0 0⍉⍵∘.⍴⍵สลับเมทริกซ์และส่งกลับแค่เส้นทแยงมุมหลัก นี่ทำให้เราได้ชิ้นส่วนที่แถวและคอลัมน์⍵∘.⍴⍵เหมือนกันนั่นคือเราทำซ้ำจำนวนหลายครั้งเท่ากับค่าของมัน ตัวอย่างเช่นนี่คือ:

4 4 4 4  1  5 5 5 5 5

เปลี่ยนอาร์กิวเมนต์เป็นรายการ การใช้ตัวดำเนินการ transpose ( ) เราได้เวกเตอร์ที่มี 3 เวกเตอร์ Enlist ( ) เปลี่ยนเป็นเวกเตอร์เดียวที่มีองค์ประกอบทั้งหมด

S←...Sกำหนดเวกเตอร์ใหม่นี้เพื่อเวกเตอร์ ⍴Sทำให้เรามีความยาวของรายการนั้น ?เป็นตัวดำเนินการสุ่มดังนั้น?⍴Sให้ตัวเลขสุ่มระหว่าง 0 ถึงความยาวของรายการ (พิเศษ) (นี่คือเหตุผลว่าทำไมมันจึงขึ้นอยู่กับ⎕IO0 มิฉะนั้นมันจะอยู่ระหว่าง 1 ถึงความยาวรวม) S[...]ส่งคืนองค์ประกอบที่ดัชนีที่กำหนด


คุณไม่ต้องการQเนื่องจากคุณไม่เคยใช้มัน และ IIRC คุณสามารถลบขึ้นบรรทัดใหม่ก่อนที่เดล (ที่เล็ก ๆ น้อย ๆ สามเหลี่ยมสิ่งลายจุดสิ้นสุดของการทำงาน.)
Zachary

ว้าวฉันไม่เคยใหม่ที่<IO> <IO>⍉จะได้เส้นทแยงมุมหลักแม้แต่สิ่งเดียว!
Zacharý

@ Zacharýใช่ขอบคุณ ตรงไปตรงมาฉันไม่รู้ด้วยซ้ำเกี่ยวกับสิ่งที่เก็บไว้จนกว่าฉันจะลองทำภารกิจนี้เช่นกัน พบได้ที่นี่
Arc676

โอ้มี APL ฟรีที่ดีกว่า GNU อยู่มากเรียกว่า ngn APL จริงๆแล้วมันยอดเยี่ยมมาก! ( ngn.github.io/apl/webแต่มันไม่มี tradfn)
Zacharý

@ Zacharýฉันมีสิ่งนั้นด้วย :) น่าเสียดายที่ฟังก์ชั่นการแปลงไม่ทำงาน (หรือฉันพลาดอะไรบางอย่าง) ฉันจะทำการทดสอบอีกครั้งตอนนี้ฉันมีความเข้าใจที่ดีขึ้นเกี่ยวกับวิธีการทำงาน
Arc676

1

MATLAB 30 ไบต์

@(a)datasample(repelem(n,n),1)

สิ่งนี้จะถือว่า MATLAB R2015a หรือใหม่กว่าและมีการติดตั้งกล่องเครื่องมือการเรียนรู้สถิติและเครื่อง

ดูคำอธิบายด้านล่างสำหรับวิธีการrepelemใช้งาน ความแตกต่างระหว่างอันที่สั้นกว่านี้กับอันด้านล่างนี้คือกล่องเครื่องมือ S&ML รวมถึงฟังก์ชั่นdatasampleที่สามารถใช้เพื่อรับองค์ประกอบหนึ่งอย่างหรือมากกว่าจากอาเรย์โดยการสุ่ม (พร้อมความน่าจะเป็นแบบเดียวกัน)input/dispโทร

MATLAB, 49 ไบต์

n=input('');a=repelem(n,n);disp(a(randi(nnz(a))))

รหัสนี้อนุมานว่า MATLAB R2015a หรือใหม่กว่านั้นถูกใช้เช่นเดียวกับเมื่อมีrepelemการแนะนำฟังก์ชั่นrepelemเป็นฟังก์ชั่นที่รับพารามิเตอร์สองตัวอันแรกคืออาร์เรย์ของตัวเลขที่จะทำซ้ำและอันที่สองคืออาร์เรย์จำนวนองค์ประกอบที่สอดคล้องกันที่ควรทำซ้ำ เป็นหลักฟังก์ชั่นทำการถอดรหัสการรันความยาวโดยการให้หมายเลขและความยาวการรัน

โดยการให้อินพุตเดียวกันกับอินพุตทั้งสองของrepelemเราจบลงด้วยอาร์เรย์ซึ่งประกอบด้วยองค์ประกอบ n มากกว่าคูณ n หากเหมาะสม หากคุณให้คุณจะได้รับ[1 2 3] [1 2 2 3 3 3]หากคุณให้คุณจะได้รับ[1 2 4 2] [1 2 2 4 4 4 4 2 2]การทำเช่นนี้หมายความว่าถ้าเราเลือกองค์ประกอบที่มีความน่าrandi(m)จะเป็นแบบเดียวกัน ( ให้จำนวนเต็มแบบสุ่มจาก 1 ถึง m กับความน่าจะเป็นแบบเดียวกัน) แต่ละองค์ประกอบ n มีความน่าจะเป็นสูงกว่าการเลือก n ในตัวอย่างแรกของ[1 2 3], 1จะมีโอกาสที่ 1/6 2จะมีโอกาสที่ 2/6 และ3จะมีโอกาสที่ 3/6


ในฐานะที่เป็นข้อความด้านเนื่องจากrepelemยังไม่มีให้สำหรับ Octave ฉันไม่สามารถให้ลิงค์ TIO ได้ นอกจากนี้เนื่องจากไม่สามารถใช้อ็อคเทฟได้จึงมีบทลงโทษที่รุนแรงinput()และdisp()จำเป็นต้องใช้เนื่องจากไม่สามารถใช้งานฟังก์ชั่นนิรนามได้ หากรองรับระดับแปดrepelemเสียงสามารถใช้สิ่งต่อไปนี้:

@(n)a(randi(nnz(a=repelem(n,n))))

นั่นน่าจะช่วยได้ 16 ไบต์ แต่ก็ไม่เป็นเช่นนั้น


ขอบคุณคำอธิบายจริงๆขอบคุณ!
Ian H.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.