Graph 圆上的随机点

Graph 圆上的随机点,graph,stata,Graph,Stata,有没有办法在一个圆上随机散布预定义数量的点?下面的示例在正方形上随机散布点,但我需要该区域为圆形 clear set seed 101010 set obs 225 // There should be 225 dots on the circle. gen x1 = runiform() gen y1 = runiform() twoway (scatter x1 y1 /// , graphregion(color(white)) xtitle(&q

有没有办法在一个圆上随机散布预定义数量的点?下面的示例在正方形上随机散布点,但我需要该区域为圆形

clear
set seed 101010
set obs 225           // There should be 225 dots on the circle. 
gen x1 = runiform()
gen y1 = runiform()

twoway  (scatter x1 y1 ///
        , graphregion(color(white)) xtitle("") ytitle("") ///
        yscale(lstyle(none)) xscale(lstyle(none)) ///
        ylabel(none, nolabels noticks nogrid) xlabel(none, nolabels noticks nogrid))
clear 
set seed 1010101
set obs 10000
gen obs = _n
gen N = _N
gen y = sqrt(runiform())
gen angle = obs * 2 * _pi / N

gen obsx = (y * cos(angle))
gen obsy = (y * sin(angle))

* Keep required number of dots
generate random = runiform()
sort random
keep if _n <= 250

twoway scatter obsx obsy, graphregion(color(white)) xtitle("") ytitle("") ///
            yscale(lstyle(none)) xscale(lstyle(none)) ysize(1) xsize(1) ///
            ylabel(none, nolabels noticks nogrid) xlabel(none, nolabels noticks nogrid)  
编辑 下面的代码概述了一种可能的解决方案,但这些点并不分布 在整个区域均匀分布。由于这在有大量点时最为明显,下面的代码生成10000个观察值

你知道如何使点均匀分布在整个区域吗

clear 
set obs 10000
gen obs = _n
gen N = _N
gen y = runiform()
gen angle = obs * 2 * _pi / N

gen obsx = y * cos(angle)
gen obsy = y * sin(angle)

twoway scatter obsx obsy, msize(tiny) graphregion(color(white)) xtitle("") ytitle("") ///
            yscale(lstyle(none)) xscale(lstyle(none)) ysize(1) xsize(1) ///
            ylabel(none, nolabels noticks nogrid) xlabel(none, nolabels noticks nogrid)  
清除
设定种子101010
设置obs 225
gen x1=2*(runiform()-0.5)
gen y1=2*(runiform()-0.5)
双向(如果(x1^2+y1^2<1)分散x1 y1)///
,graphregion(彩色(白色))xtitle(“”)ytitle(“”)///
yscale(lstyle(none))xscale(lstyle(none))方面(1)///
ylabel(无,无标签通知无标签)xlabel(无,无标签通知无标签))

根据Nick Cox评论中的建议,下面是生成 一个圆上任意给定数量的点

clear
set seed 101010
set obs 225           // There should be 225 dots on the circle. 
gen x1 = runiform()
gen y1 = runiform()

twoway  (scatter x1 y1 ///
        , graphregion(color(white)) xtitle("") ytitle("") ///
        yscale(lstyle(none)) xscale(lstyle(none)) ///
        ylabel(none, nolabels noticks nogrid) xlabel(none, nolabels noticks nogrid))
clear 
set seed 1010101
set obs 10000
gen obs = _n
gen N = _N
gen y = sqrt(runiform())
gen angle = obs * 2 * _pi / N

gen obsx = (y * cos(angle))
gen obsy = (y * sin(angle))

* Keep required number of dots
generate random = runiform()
sort random
keep if _n <= 250

twoway scatter obsx obsy, graphregion(color(white)) xtitle("") ytitle("") ///
            yscale(lstyle(none)) xscale(lstyle(none)) ysize(1) xsize(1) ///
            ylabel(none, nolabels noticks nogrid) xlabel(none, nolabels noticks nogrid)  
清除
设定种子1010101
设置obs 10000
gen obs=\u n
第N代=\u N
gen y=sqrt(runiform())
发电机角度=obs*2*\u pi/N
发电机obsx=(y*cos(角度))
发电机obsy=(y*sin(角度))
*保持所需的点数
生成random=runiform()
随机排序
保持如果_n这里有一个答案,1)对任何边界半径都是通用的(这可能对您没有用处);和2)从显式使用N


clear 
set seed 101010
set obs 250
gen obs = _n
scalar R = 1 // set the  bounding radius
gen y = R * sqrt(runiform()) // random "sub" radius
gen angle = runiform() * 2 * _pi

gen obsx = y * cos(angle)
gen obsy = y * sin(angle)

twoway scatter obsx obsy, msize(tiny) graphregion(color(white)) xtitle("") ytitle("") ///
            yscale(lstyle(none)) xscale(lstyle(none)) ysize(1) xsize(1) ///
            ylabel(none, nolabels noticks nogrid) xlabel(none, nolabels noticks nogrid)  
            

谢谢,此解决方案丢弃圆外的点,但圆应包含固定数量的点。这里,全部225个点。我编辑了这个问题以澄清问题。再次感谢。这是你的练习,不是我的。也许用极坐标代替半径和角度。这是一个好主意,谢谢。我建议你用随机制服的平方根。你可以接受你自己的答案。这很好。