- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
当从连续的一组值中随机抽取时,允许抽取的值再次绘制,给定的值(当然)有很小的机会被立即连续绘制两次(或更多),但这会导致问题(对于给定的应用程序),我们希望消除这种机会。关于如何做到这一点(简单/高效)的任何算法想法?
理想情况下,我们希望将阈值设置为数据集大小的百分比:
假设值集的大小N=100
,阈值T=10%
,那么如果给定的值在当前绘制中被绘制,它保证不会在接下来的 N*T=10
抽奖中再次出现。
显然,此限制会在随机选择中引入偏差。我们不介意所提出的算法在选择的随机性中引入了进一步的偏差,真正这个应用程序的问题是选择是足够随机的对于人类观察者。
作为一个实现细节,这些值存储为数据库记录,因此可以使用数据库表标志/值,或者可能是外部存储器结构。也欢迎有关抽象案例的回答。
编辑:
我刚刚遇到了另一个 SO 问题 here ,这与我自己的有很好的重叠。回顾那里的优点。
最佳答案
这是一个在 O(1)
中完成整个过程的实现(对于单个元素),没有任何偏差:
想法是将数组 A
中的最后 K 个元素(其中包含所有值)视为一个队列,我们从前 N-k
个值中提取一个值A
中的随机值,与N-Pointer
位置的一个元素交换,当Pointer代表队列的头部,当Pointer代表队列头部时,重置为1它跨越了 K 个元素。
为了消除前 K 次抽取中的任何偏差,随机值将在 1
和 N-Pointer
之间而不是 N-k
之间抽取,所以这个虚拟队列的大小在每次绘制时都在增加,直到达到 K
的大小(例如,在 3 次绘制之后,可能值的数量出现在索引 1 之间的
和 A
中N-3
,挂起的值出现在索引 N-2
到 N
中。
绘制单个元素的所有操作都是O(1)
,并且在整个过程中没有偏差。
void DrawNumbers(val[] A, int K)
{
N = A.size;
random Rnd = new random;
int Drawn_Index;
int Count_To_K = 1;
int Pointer = K;
while (stop_drawing_condition)
{
if (Count_To_K <= K)
{
Drawn_Index = Rnd.NextInteger(1, N-Pointer);
Count_To_K++;
}
else
{
Drawn_Index = Rnd.NextInteger(1, N-K)
}
Print("drawn value is: " + A[Drawn_Index])
Swap(A[Drawn_Index], A[N-Pointer])
Pointer--;
if (Pointer < 1) Pointer = K;
}
}
我之前的建议,通过使用一个列表和一个实际的队列,依赖于列表的remove
方法,我相信它最多可以是O(logN)
通过使用数组实现自平衡二叉树,因为列表必须直接访问索引。
void DrawNumbers(list N, int K)
{
queue Suspended_Values = new queue;
random Rnd = new random;
int Drawn_Index;
while (stop_drawing_condition)
{
if (Suspended_Values.count == K)
N.add(Suspended_Value.Dequeue());
Drawn_Index = Rnd.NextInteger(1, N.size) // random integer between 1 and the number of values in N
Print("drawn value is: " + N[Drawn_Index]);
Suspended_Values.Enqueue(N[Drawn_Index]);
N.Remove(Drawn_Index);
}
}
关于algorithm - 在随机抽取 : how to insure that a value is not re-drawn too soon,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19400813/
我试图通过在加载页面时隐藏 webView 来在不同网页的加载之间进行转换。但是,我发现一些图像密集型网站导致 webViewDidFinishLoading 过早触发,当我在此时显示 webView
我们有一个时间很关键的应用程序。我们正在使用 joda 进行时间转换并以 UTC 时间存储所有数据。我们已经投入生产一段时间了,一切都很完美,但是…… 现在我们注意到时间更改前几个小时发生的事件已经转
所以我尝试将 HashMap 作为 JSON 文件保存到应用程序的内部存储中。这效果很好,正如我在设备文件资源管理器中看到的那样,所有内容都已正确保存。然后,当我重新启动应用程序并从文件中读取时,它也
我正在查看 Guava 的 FluentIterable 的 javadoc 和网络上的大量示例,他们倾向于将 limit() 放在 filter() 和 transform() 之后,这表明所有元素
我正在寻找一种简单的方法来为我在 Ruby on Rails 上的项目实现简单的“即将推出”(预启动)页面。用户应该能够留下电子邮件以便在项目启动时收到通知。 有没有这样的插件\gem?或者我应该自己
我使用这个代码将我的化身旋转到Target Postion,但问题是它总是旋转得太快&比持续时间快。。有什么好主意吗?
我使用这个代码将我的化身旋转到Target Postion,但问题是它总是旋转得太快&比持续时间快。。有什么好主意吗?
我制作了一个只持续几帧的短 MovieClip,并在第 1 帧上放置了一个跟踪语句。令我惊讶的是,只是简单地实例化它,甚至没有将它添加到舞台上,跟踪语句立即开始触发。 var m:MovieClip
在同样的情况下,当我调用 observe 时,Android Studio 会显示警告消息LiveData的方法目的 viewModel.emailValidationResult.observe(v
我曾在 Android 上看到一个应用程序,只要有人在文本框中输入任何内容,显示输出的另一个文本框就会自动更改,而无需按任何按钮或任何其他操作。我想知道如何为 Android 应用程序执行此操作。 最
我想使用 bootstrap 获得我的表单的以下布局: Working on [Select field] [Select Button] 所以:所有元素都在一行中(有足够的空间可用)。 但是当我减小
在我的项目中,我使用 Logback 作为日志工具。我有以下类(class) @Component class Test { @PreDestroy public void destr
当从连续的一组值中随机抽取时,允许抽取的值再次绘制,给定的值(当然)有很小的机会被立即连续绘制两次(或更多),但这会导致问题(对于给定的应用程序),我们希望消除这种机会。关于如何做到这一点(简单/高效
我的 HDR 应用程序可以使用不同的曝光补偿设置拍摄三张照片,但我无法在拍摄后立即更改曝光补偿值。属性更新时间有限制吗? for var i = 0 ; i ", error: nil)
我的情况是我们的网页在桌面上看起来不错,但是如果您在移动设备上查看它,一切都会变得不对劲,我知道这是基于我用来创建页面的 css,但是我想要如果从移动设备查看网站,则重定向到“移动友好网站即将推出”页
我住在边境附近,在另一个国家工作。所以我选择了自己的网络提供商作为最爱。但是,我注意到它会尽可能长时间地与提供者保持联系。因此,当我从我的国家开始时,即使我跨越国界,我也会保留我的网络,但是,当我从另
我在我的应用程序中使用核心位置来在应用程序首先启动时获取用户的位置,然后在后台进入前台时获取用户的位置。取好位置后 NSString *mylatitude = [[NSNumber numberWi
我在 Azure Web 服务器/门户上有一个静态网站,其中包含我们公司的文档。最近,我一直在更改我们设置 cookie 的代码,以确保它们符合浏览器 SameSite 要求,如下所述: https:
自 Android Studio 3.5 更新以来,我在构建我的应用程序时收到此警告: DSL element 'useProguard' is obsolete and will be remove
我正在尝试将 GPS 坐标发送到 Android 中的服务器,但我的应用程序一运行就崩溃了,我是 Android 新手,所以我不知道如何解决此问题 这是我的 logcat 文件 01-23 14:03
我是一名优秀的程序员,十分优秀!