【问题标题】:Need help adding random float in SQLite需要帮助在 SQLite 中添加随机浮点数
【发布时间】:2019-01-04 09:52:27
【问题描述】:

我正在尝试将随机浮点数添加到 SQLite 中整个列的现有值

将一个数字添加到现有的应该不难,UPDATE myTable SET Column1=Column1+1 应该可以工作。如果我是正确的,它将获取 column1 中的每个值并将其加 1。

问题是得到随机数,我的目标是有类似的东西

UPDATE mytable SET Column1=(Column1 + (RAND Between 0.5 AND 0.8));

所以每一行都添加了一个不同的随机浮点数,这是在添加到它的 2 个浮点数之间生成的。

我的问题是我在 SQLite 下找到的唯一参考 random 是 random 函数生成一个整数。

【问题讨论】:

  • 您是如何尝试将整数转换为浮点数的?为什么它不起作用?
  • 我没有尝试将 int 转换为浮点数,首先我不知道如何在查询中做到这一点,其次,这仍然没有给我一个其他两个浮点数浮点数,最接近的方法是生成一个 int 然后将其划分为浮点数,但这仍然依赖于我不(不)知道的转换。
  • 对不起,如果这听起来有点苛刻,不是我的意图,但阅读它可能会有这种感觉,此外,我还读到随机函数只生成一次每个查询,不确定这是否属实,我正在制定一个转换为浮点数的查询。任何对此的提醒都会很有用
  • 将 int 转换为 float 可能导致“指数随机”,在 0..1 中不均匀

标签: sqlite random


【解决方案1】:

您可以从 SQLite 中获取区间 (-1, 1] 中的随机浮点数,如下所示:

SELECT RANDOM() / CAST(-9223372036854775808 AS REAL)

因此,您可以通过以下方式获得标准随机数区间 [0, 1) 中的值:

SELECT 0.5 - RANDOM() / CAST(-9223372036854775808 AS REAL) / 2

...并从那里进行适当的修改。

【讨论】:

    【解决方案2】:

    documentation 说:

    random() 函数返回一个介于 -9223372036854775808 和 +9223372036854775807 之间的伪随机整数。

    因此,要获得介于 -1 和 1 之间的数字,您必须将返回值除以 9223372036854775808。

    要得到一个介于 0 和 1 之间的数字,请除以 2×9223372036854775808,然后加上 ½。

    要获得其他范围,请适当缩放并添加偏移量:

    UPDATE MyTable
    SET Column1 = Column1 + (random() / 18446744073709551616 + 0.5) * 0.3 + 0.5;
    

    【讨论】:

    • 感谢您的回答,使用您对问题的回答,我进行了更多搜索并得到了这个 UPDATE TableName SET Column1 = (Column1 + ((abs(random()) % (100-1) + 1) *0.001)) 这会在 0.001 和 1 之间创建一个随机浮点数(至少它应该在我的测试查询中起作用)我也会测试你的,出于兴趣哪个更有效?
    • 再次抱歉,意思是 0.1 和 0.001,为了得到 0.01 到 1.0 编辑上面的 *0.01 UPDATE TableName SET Column1 = (Column1 + ((abs(random()) % (100-1) + 1)*0.01))
    • 再次感谢您提供的信息,非常感谢,任何机会您都可以参考 % 部分,因为我只在互联网上的其他地方找到了这个示例(随机函数上的 sqlite 页面没有显示关于它的任何事情sqlite.org/c3ref/randomness.html)所以我不确定% (:High-:Low)+:Low 部分对不起,如果这是一个菜鸟问题,我不太擅长编程,而且对数据库整体来说相当新
    • 这不起作用,因为 18446744073709551616 等于 0。
    【解决方案3】:

    虽然这里的其他答案同样有效,但我应该提到 SQLite has an API for calling foreign functions,它在多种语言的绑定中公开。这可以让您定义与宿主语言的随机函数的绑定,而不是使用内置函数。例如,在 Python 中,使用他们的 sqlite3 模块,很简单:

    import random, sqlite3
    db_conn = sqlite3.connect(":memory:")
    
    # A function named "random_between" with 2 arguments
    # that calls the python function random.uniform
    db_conn.create_function('random_between', 2, random.uniform)
    
    results = db_conn.execute("SELECT random_between(0.3, 0.8)").fetchall()
    print(results)
    

    这避免了您的 SQL 查询因算术而变得混乱,并使其看起来更像您最初的目标。它确实需要您通过 C API 或特定于语言的绑定来运行查询,这不能作为“纯 SQL”解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-25
      • 2014-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多