【发布时间】:2021-10-07 05:09:19
【问题描述】:
我想在屏幕上随机绘制像素,因此概率不应该平均分布。
示例:假设屏幕有 1920 x 1080 像素。在绘图事件中,位于位置 (500,500) 的 100 x 100 矩形中的像素被绘制的概率应该是矩形外像素的 10 倍。
为了实现这一点,我首先创建了一个包含概率的数组。矩形内的位置的值为 10,所有其他位置的值为 1。
for i := 1 to 1920 do
begin
for j := 1 to 1080 do
begin
FProbability[i, j]:=1;
if InRange(i, 500, 600) and InRange(j, 500, 600) then
begin
FProbability[i, j]:=10;
end;
end;
end;
然后我列出所有像素:
FPixelList:=TList<TPoint>.Create;
for i := 1 to 1920 do
begin
for j := 1 to 1080 do
begin
for k := 1 to FProbabilty[i, j] do
begin
FPixelList.Add(TPoint.Create(i,j))
end;
end;
end;
像素列表现在对于矩形内的每个像素有 10 个条目,对于所有其他像素位置有 1 个条目。
在绘制事件中,我得到要绘制的像素位置
FPixelList[RandomRange(0, FPixelList.Count-1)]
这很好用。
但是我想知道这个问题是否有其他解决方案。如果屏幕尺寸变大,我的解决方案会使用大量内存,并且我只能使用整数值作为概率。
【问题讨论】:
-
请注意,这本质上是一个与语言无关的问题;答案在 C++、C#、Rust 或 x86 汇编中(基本上)是相同的。事实上,这只是一个编程问题:它本质上是一个纯数学问题。
-
您不需要任何内存。假设问题是你想要正面和反面,但反面的可能性是两倍。然后使用 Random(3) 和 0 表示正面,1 或 2 表示反面。扩展这个概念,你就完成了。
标签: delphi random probability